<!DOCTYPE html>
<html lang="en-us">
<head>
	<meta charSet="UTF-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
	<link rel="apple-touch-icon" sizes="57x57" href="/CsvHelper/favicons/apple-icon-57x57.png" />
	<link rel="apple-touch-icon" sizes="60x60" href="/CsvHelper/favicons/apple-icon-60x60.png" />
	<link rel="apple-touch-icon" sizes="72x72" href="/CsvHelper/favicons/apple-icon-72x72.png" />
	<link rel="apple-touch-icon" sizes="76x76" href="/CsvHelper/favicons/apple-icon-76x76.png" />
	<link rel="apple-touch-icon" sizes="114x114" href="/CsvHelper/favicons/apple-icon-114x114.png" />
	<link rel="apple-touch-icon" sizes="120x120" href="/CsvHelper/favicons/apple-icon-120x120.png" />
	<link rel="apple-touch-icon" sizes="144x144" href="/CsvHelper/favicons/apple-icon-144x144.png" />
	<link rel="apple-touch-icon" sizes="152x152" href="/CsvHelper/favicons/apple-icon-152x152.png" />
	<link rel="apple-touch-icon" sizes="180x180" href="/CsvHelper/favicons/apple-icon-180x180.png" />
	<link rel="icon" type="image/png" sizes="192x192" href="/CsvHelper/favicons/android-icon-192x192.png" />
	<link rel="icon" type="image/png" sizes="32x32" href="/CsvHelper/favicons/favicon-32x32.png" />
	<link rel="icon" type="image/png" sizes="96x96" href="/CsvHelper/favicons/favicon-96x96.png" />
	<link rel="icon" type="image/png" sizes="16x16" href="/CsvHelper/favicons/favicon-16x16.png" />
	<link rel="manifest" href="/CsvHelper/manifest.json" />
	<meta name="msapplication-TileColor" content="#ffffff" />
	<meta name="msapplication-TileImage" content="/ms-icon-144x144.png" />
	<meta name="theme-color" content="#ffffff" />
	<title>Change Log | CsvHelper</title>

	
	
		<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.9.1/css/bulma.min.css" />
	
	<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.5.0/styles/default.min.css" />
	<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.5.0/styles/vs.min.css" />
	<link rel="stylesheet" href="/CsvHelper/styles/index.css" />

	<script defer src="https://use.fontawesome.com/releases/v5.14.0/js/all.js"></script>
	<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.5.0/highlight.min.js"></script>
</head>
<body>
	<header id="header" class="header">
	<nav class="navbar is-light">
		<div class="navbar-brand">
			<a class="navbar-item" href="/CsvHelper">
				<img src="/CsvHelper/images/logo.svg" width="66" height="28" />
			</a>
			<div id="navbar-burger" class="navbar-burger">
				<span></span>
				<span></span>
				<span></span>
			</div>
		</div>
		<div id="navbar-menu" class="navbar-menu">
			<div class="navbar-start">
				<a class="navbar-item" href="/CsvHelper/getting-started">Getting Started</a>
				<a class="navbar-item" href="/CsvHelper/examples">Examples</a>
				<a class="navbar-item" href="/CsvHelper/migration">Migration</a>
				<a class="navbar-item" href="/CsvHelper/change-log">Change Log</a>
			</div>
			<div class="navbar-end">
				<a class="navbar-item" href="https://twitter.com/JoshClose">
					<span class="icon">
						<i class="fab fa-twitter"></i>
					</span>
				</a>
				<a class="navbar-item" href="https://github.com/JoshClose/CsvHelper">
					<span class="icon">
						<i class="fab fa-github"></i>
					</span>
				</a>
			</div>
		</div>
	</nav>
</header>


	<main id="main" class="container is-fluid">
		<div class="columns is-variable is-1">
				<div class="column">
					<div class="content">
						<h1 id="change-log">Change Log</h1>
<h3 id="section">33.0.1</h3>
<h4 id="bug-fixes">Bug Fixes</h4>
<ul>
<li>Added more things that can be null.</li>
</ul>
<h3 id="section-1">33.0.0</h3>
<h4 id="features">Features</h4>
<ul>
<li>Nullable turned on.</li>
<li>Moved Microsoft.Bcl.AsyncInterfaces to 8.0.0.</li>
</ul>
<h4 id="breaking-changes">Breaking Changes</h4>
<ul>
<li>Nullable being turned on could cause a lot of code changes.</li>
</ul>
<h3 id="section-2">32.0.3</h3>
<h4 id="bug-fixes-1">Bug Fixes</h4>
<ul>
<li>Dispose of IEnumerator in CsvWriter.</li>
</ul>
<h3 id="section-3">32.0.2</h3>
<h4 id="bug-fixes-2">Bug Fixes</h4>
<ul>
<li>Fixed issue with writing where an IEnumerable was getting projected twice.</li>
</ul>
<h3 id="section-4">32.0.1</h3>
<h4 id="bug-fixes-3">Bug Fixes</h4>
<ul>
<li>Fully implemented <code>IDictionary&lt;string, object&gt;</code> on <code>FastDynamicObject</code>.</li>
</ul>
<h3 id="section-5">32.0.0</h3>
<h4 id="features-1">Features</h4>
<ul>
<li>Reading and writing performance optimizations when using multiple records.</li>
<li>Reading and writing performance optimizations when using <code>dynamic</code>.</li>
</ul>
<h4 id="breaking-changes-1">Breaking Changes</h4>
<ul>
<li>Changed <code>RecordWriter.CreateWriteDelegate&lt;T&gt;(T record)</code> to <code>RecordWriter.CreateWriteDelegate&lt;T&gt;(Type type)</code>.</li>
<li>Changed <code>DynamicRecordWriter.CreateWriteDelegate&lt;T&gt;(T record)</code> to <code>DynamicRecordWriter.CreateWriteDelegate&lt;T&gt;(Type type)</code>.</li>
<li>Changed <code>ExpandoObjectRecordWriter.CreateWriteDelegate&lt;T&gt;(T record)</code> to <code>ExpandoObjectRecordWriter.CreateWriteDelegate&lt;T&gt;(Type type)</code>.</li>
<li>Changed <code>ObjectRecordWriter.CreateWriteDelegate&lt;T&gt;(T record)</code> to <code>ObjectRecordWriter.CreateWriteDelegate&lt;T&gt;(Type type)</code>.</li>
<li>Changed <code>PrimitiveRecordWriter.CreateWriteDelegate&lt;T&gt;(T record)</code> to <code>PrimitiveRecordWriter.CreateWriteDelegate&lt;T&gt;(Type type)</code>.</li>
<li>Changed <code>RecordWriterFactory.MakeRecordWriter&lt;T&gt;(T record)</code> to <code>RecordWriterFactory.MakeRecordWriter&lt;T&gt;(RecordTypeInfo typeInfo)</code>.</li>
<li>Removed <code>RecordManager.Create</code> methods. Use <code>Func&lt;T&gt; RecordManager.GetReadDelegate&lt;T&gt;(Type recordType)</code> instead.</li>
<li>Removed <code>RecordManager.Write</code> methods. Use <code>Action&lt;T&gt; RecordManager.GetWriteDelegate&lt;T&gt;(RecordTypeInfo typeInfo)</code> instead.</li>
<li>Removed <code>RecordCreator.Create</code> methods. Use <code>Func&lt;T&gt; RecordCreator.GetCreateRecordDelegate&lt;T&gt;(Type recordType)</code> instead.</li>
<li>Removed <code>RecordWriter.Create</code> methods. Use <code>Action&lt;T&gt; RecordWriter.GetWriteDelegate&lt;T&gt;(RecordTypeInfo typeInfo)</code> instead.</li>
<li>Changed <code>RecordWriterFactory.MakeRecordWriter&lt;T&gt;(T record)</code> to <code>RecordWriterFactory.MakeRecordWriter(RecordTypeInfo typeInfo)</code>.</li>
</ul>
<h3 id="section-6">31.0.4</h3>
<h4 id="bug-fixes-4">Bug Fixes</h4>
<ul>
<li>Changed <code>GuidConverter</code> to throw <code>TypeConverterException</code> instead of <code>FormatException</code> to be consistent with other converters.</li>
</ul>
<h3 id="section-7">31.0.3</h3>
<h4 id="bug-fixes-5">Bug Fixes</h4>
<ul>
<li>Fixed issue with <code>TypeConverter&lt;T&gt;</code> where <code>T</code> is <code>Nullable</code> did not work.</li>
</ul>
<h3 id="section-8">31.0.2</h3>
<h4 id="bug-fixes-6">Bug Fixes</h4>
<ul>
<li>Removed dependency on <code>System.Linq.Async</code>.</li>
</ul>
<h3 id="section-9">31.0.1</h3>
<h4 id="bug-fixes-7">Bug Fixes</h4>
<ul>
<li>Added InformationalVersion to assembly info.</li>
</ul>
<h3 id="section-10">31.0.0</h3>
<h4 id="features-2">Features</h4>
<ul>
<li>Created generic <code>TypeConverter</code> class to allow for easier creation of type converters.</li>
</ul>
<h4 id="breaking-changes-2">Breaking Changes</h4>
<ul>
<li><code>TypeConverter</code> was renamed to <code>NotSupportedTypeConverter</code>.</li>
<li><code>TypeConverter</code> is now a generic type converter base class.</li>
</ul>
<h3 id="section-11">30.1.0</h3>
<h4 id="features-3">Features</h4>
<ul>
<li>Added <code>static CsvConfiguration.WithAttributes</code> method to create a new configuration with attributes applied.</li>
<li>Boolean attributes have empty overload that default to true.</li>
<li><code>ShouldQuote</code> optimizations.</li>
</ul>
<h4 id="bug-fixes-8">Bug Fixes</h4>
<ul>
<li>Fixed issue with quotes at end of line getting ignore when <code>LineBreakInQuotedFieldIsBadData</code> is enabled.</li>
<li>Fixed issue where calling <code>Convert</code> on empty <code>Map()</code> would throw an exception.</li>
<li>Fixed issue where writing with <code>HasHeaderRecord</code> set to false was writing a header record.</li>
<li>Fixed issue where exception <code>This Operation is only valid on generic types</code> was being thrown.</li>
<li>Fixed issue where <code>CsvDataReader</code> couldn't be used if lines were read manually ahead of time.</li>
<li>Fixed issue where <code>CsvDataReader</code> wasn't working when <code>HasHeaderRecord</code> was false.</li>
<li>Fixed issue where <code>CsvReader.ColumnCount</code> did not match <code>CsvParser.Count</code>.</li>
<li>Fixed issue where <code>GetDelimiter</code> was not detecting the correct delimiter when there are blank lines.</li>
<li>Fixed issue where header validation was outputing error message for each field when it only needed to once.</li>
</ul>
<h3 id="section-12">30.0.3</h3>
<h4 id="bug-fixes-9">Bug Fixes</h4>
<ul>
<li>Fixed issue with .NET 7/8 not having support for DateOnly and TimeOnly.</li>
</ul>
<h3 id="section-13">30.0.1</h3>
<h4 id="bug-fixes-10">Bug Fixes</h4>
<ul>
<li>Fixed issue when writing with the escape char not being escaped if it was different than the quote char.</li>
<li>Fixed issue with <code>CsvWriter</code> not passing <code>leavOpen</code> parameter to other constructor call.</li>
<li>Fixed issue with TypeConverter being assigned to a member that has a Convert expression assigned to it.</li>
</ul>
<h3 id="section-14">30.0.0</h3>
<h4 id="features-4">Features</h4>
<ul>
<li>Added <code>Field</code> and <code>RawRecord</code> to <code>BadDataException</code>.</li>
<li>Pass <code>IWriterConfiguration</code> into <code>CsvWriter</code> constructor instead of <code>CsvConfiguration</code>.</li>
<li>Allow inherited header prefixes.</li>
<li>Allow mapping to dynamic properties.</li>
<li>Added <code>MemberName</code> to the type converter exception message.</li>
<li>Added <code>MaxFieldSize</code> configuration. If max size is set and the size is reached, <code>MaxFieldSizeException</code> is thrown.</li>
<li>Added class level attribute capability.<br />
New Attributes:
<ul>
<li><code>BufferSizeAttribute</code></li>
<li><code>CacheFieldsAttribute</code></li>
<li><code>CommentAttribute</code></li>
<li><code>CountBytesAttribute</code></li>
<li><code>DelimiterAttribute</code></li>
<li><code>DetectColumnCountChangesAttribute</code></li>
<li><code>DetectDelimiterAttribute</code></li>
<li><code>DetectDelimiterValueAttribute</code></li>
<li><code>EncodingAttribute</code></li>
<li><code>EscapeAttribute</code></li>
<li><code>ExceptionMessagesContainRawDataAttribute</code></li>
<li><code>HasHeaderRecordAttribute</code></li>
<li><code>IgnoreBlankLinesAttribute</code></li>
<li><code>IgnoreReferencesAttribute</code></li>
<li><code>IncludePrivateMembersAttribute</code></li>
<li><code>InjectionCharactersAttribute</code></li>
<li><code>InjectionEscapeCharacterAttribute</code></li>
<li><code>InjectionOptionsAttribute</code></li>
<li><code>LineBreakInQuotedFieldIsBadDataAttribute</code></li>
<li><code>MaxFieldSizeAttribute</code></li>
<li><code>ModeAttribute</code></li>
<li><code>NewLineAttribute</code></li>
<li><code>ProcessFieldAttribute</code></li>
<li><code>QuoteAttribute</code></li>
<li><code>TrimOptionsAttribute</code></li>
<li><code>UseNewObjectForNullReferenceMembersAttribute</code></li>
<li><code>WhiteSpaceCharsAttribute</code></li>
</ul>
</li>
<li>Added <code>params object[] constructorArgs</code> to <code>TypeConverterAttribute</code>.</li>
<li>Added validation message expression to <code>Validate</code> mapping.</li>
<li>Added <code>IReaderRow</code> to <code>ValidateArgs</code>.</li>
<li>Relax <code>Default</code> and <code>Constant</code> type constraints to <code>IsAssignableFrom</code>.</li>
</ul>
<h4 id="bug-fixes-11">Bug Fixes</h4>
<ul>
<li>Added <code>null</code> check in <code>WriteRecords</code>.</li>
<li>Fixed interpolation in exception message.</li>
<li>Fixed constructor mapping issue where parameter has a type converter but would still try and use constructor mapping.</li>
</ul>
<h4 id="breaking-changes-3">Breaking Changes</h4>
<ul>
<li>Added <code>string field</code> and <code>string rawRecord</code> to <code>BadDataException</code> constructor.</li>
<li>Added <code>double MaxFieldSize { get; }</code> to <code>IParserConfiguration</code>.</li>
<li>Added <code>bool LeaveOpen { get; }</code> to <code>IWriterConfiguration</code>.</li>
<li>Added <code>bool LeaveOpen { get; }</code> to <code>IParserConfiguration</code>.</li>
<li>Added <code>IReaderRow row</code> to <code>ValidateArgs</code> constructor.</li>
</ul>
<h3 id="section-15">29.0.0</h3>
<h4 id="features-5">Features</h4>
<ul>
<li>Added support for <code>TypeConverter</code> factories. This allows for the ability to handle many types at once.
Code that manually handle nullable, enums, and collections were changed into factories.</li>
<li>Moved delimiter detection into a configuration function.
This allows for a user to easily change the detection logic.
Default logic is in <code>ConfigurationFunction.GetDelimiter</code>.</li>
<li>Changed <code>CsvConfiguration.SanitizeInjection</code> flag to <code>CsvConfiguration.InjectionOptions</code> enum.
<ul>
<li>Options are:
<ul>
<li>None - Default. Does no injection protection. The is default because it's not a part of CSV and is used for an external tool.</li>
<li>Escape - Escapes the field based on OWASP recommendations if an injection char is detected.</li>
<li>Strip - Removes the injection character.</li>
<li>Exception - Throws an exception if an injection char is detected.</li>
</ul>
</li>
<li>Added <code>\t</code> and <code>\r</code> to <code>CsvConfiguration.InjectionEscapeCharacter</code>.</li>
<li>Changed <code>CsvConfiguration.InjectionEscapeCharacter</code> from <code>\t</code> to <code>'</code>.</li>
</ul>
</li>
<li><code>CsvDataReader.GetDataTypeName</code> will use types when the schema table is overridden.</li>
<li>More detail added to <code>CsvConfiguration.Validate</code> exception messages.</li>
<li>Reduce double dictionary lookup in a few places.</li>
</ul>
<h4 id="bug-fixes-12">Bug Fixes</h4>
<ul>
<li>Fixed issues with delimiter detection logic.</li>
<li>Missing <code>ConfigureAwait(false)</code> added to async calls.</li>
<li>Fixed issue with <code>CsvReader.TryGetField</code> throwing an exception when multiple headers are read.</li>
<li>Fixed issue with <code>MemberMap.Validate</code> passing the wrong type into the expression call.</li>
<li>Fixed issue with <code>MemberMap&lt;T&gt;.Convert</code> not working with <code>static</code> methods.</li>
<li>Fixed issue with <code>DateTimeConverter</code> and <code>DateTimeOffsetConverter</code> throwing an exception other than <code>TypeConverterException</code> on failure.</li>
<li>Fixed issue where <code>MissingFieldFound</code> was not being called if <code>IgnoreBlankLines</code> was off.</li>
</ul>
<h4 id="breaking-changes-4">Breaking Changes</h4>
<ul>
<li><code>CsvConfiguration.SanitizeForInjection</code> -&gt; <code>CsvConfiguration.InjectionOptions</code></li>
<li><code>bool IWriterConfiguration.SanitizeForInjection</code> -&gt; <code>InjectionOptions IWriterConfiguration.InjectionOptions</code></li>
<li><code>CsvConfiguration.InjectionEscapeCharacter</code> changed from <code>\t</code> to <code>'</code>.</li>
<li>Added <code>\t</code> and <code>\r</code> to <code>CsvConfiguration.InjectionCharacters</code>.</li>
<li>Added <code>GetDelimiter IParserConfiguration.GetDelimiter</code> delegate.</li>
</ul>
<h3 id="section-16">28.0.1</h3>
<h4 id="bug-fixes-13">Bug Fixes</h4>
<ul>
<li>Disabled nullable until all null issues are fixed.</li>
</ul>
<h3 id="section-17">28.0.0</h3>
<h4 id="features-6">Features</h4>
<ul>
<li>Updated delimiter detection algorithm.
<ul>
<li>Strips escaped text based on mode.</li>
<li>Only looks for delimiters that appear on every line.</li>
<li>Uses <code>CultureInfo.TextInfo.ListSeparator</code> if it's on every line.</li>
</ul>
</li>
<li>Cache processed fields in parser so they're not processed on every access.</li>
<li>Cache <code>CsvParser.Record[]</code> so multiple calls wont' regenerate it.</li>
<li><code>ShouldSkipRecord</code> is <code>null</code> by default and won't get called if not set.</li>
<li><code>ShouldSkipRecordArgs</code> holds <code>IReaderRow</code> now instead of <code>string[]</code>.</li>
<li>Changed <code>CsvParser</code> constructor to take in <code>IParserConfiguration</code> instead of <code>CsvConfiguration</code>.</li>
<li>Changed <code>CsvReader</code> constructor to take in <code>IReaderConfiguration</code> instead of <code>CsvConfiguration</code>.</li>
</ul>
<h4 id="bug-fixes-14">Bug Fixes</h4>
<ul>
<li>Fixed issue where collection types weren't getting the correct <code>MemberMapData</code> passed to them when converting the item.</li>
<li>Fixed issue where <code>BadDataFound</code> was being called multiple times for the same field.</li>
<li>Fixed issue where you can't read with no header when a name has been mapped.</li>
<li>Fixed issue where quoted fields not correctly being identified if there was a buffer swap on white space before quote.</li>
</ul>
<h4 id="breaking-changes-5">Breaking Changes</h4>
<ul>
<li><code>ShouldSkipRecordArgs</code> holds <code>IReaderRow</code> now instead of <code>string[]</code>.</li>
<li>Removed <code>ConfigurationFunctions.ShouldSkipRecord</code> as the default is now <code>null</code>.</li>
<li>Added <code>IParserConfiguration.Validate</code>.</li>
</ul>
<h3 id="section-18">27.2.1</h3>
<h4 id="bug-fixes-15">Bug Fixes</h4>
<ul>
<li>Changed dependencies to minimal needed version.</li>
</ul>
<h3 id="section-19">27.2.0</h3>
<h4 id="features-7">Features</h4>
<ul>
<li>Support for net60 <code>DateOnly</code> and <code>TimeOnly</code> types.</li>
</ul>
<h3 id="section-20">27.1.1</h3>
<h4 id="bug-fixes-16">Bug Fixes</h4>
<ul>
<li>Fixed issue with delimiter detection in parser async read.</li>
</ul>
<h3 id="section-21">27.1.0</h3>
<h4 id="features-8">Features</h4>
<ul>
<li>Added IgnoreBaseAttribute to not look at the base class when auto mapping.</li>
</ul>
<h3 id="section-22">27.0.4</h3>
<h4 id="bug-fixes-17">Bug Fixes</h4>
<ul>
<li>Changed delimiter detection to look line by line instead of the full buffer.</li>
</ul>
<h3 id="section-23">27.0.3</h3>
<h4 id="bug-fixes-18">Bug Fixes</h4>
<ul>
<li>Specified exact dependency version matches.</li>
</ul>
<h3 id="section-24">27.0.2</h3>
<h4 id="bug-fixes-19">Bug Fixes</h4>
<ul>
<li>Fixed issue with delimiter detection.</li>
</ul>
<h3 id="section-25">27.0.1</h3>
<h4 id="bug-fixes-20">Bug Fixes</h4>
<ul>
<li><code>\t</code> wasn't removed and just an exception was being thrown.</li>
</ul>
<h3 id="section-26">27.0.0</h3>
<h4 id="features-9">Features</h4>
<ul>
<li>Config option to auto detect delimiter. Off by default.</li>
<li>Added ability to apply a type converter to all registered types.</li>
<li>Added ability to apply type converter options to all registered types.</li>
<li>Added ability to pass an IAsyncEnumerable to WriteRecords.</li>
<li>Added option to use default value on conversion failure.</li>
</ul>
<h4 id="breaking-changes-6">Breaking Changes</h4>
<ul>
<li>Added <code>IParserConfiguration.DetectDelimiter</code>.</li>
<li>Added <code>IParserConfiguration.DetectDelimiterValues</code>.</li>
<li>Added <code>IWriter.WriteRecordsAsync&lt;T&gt;(IAsyncEnumerable&lt;T&gt; records, CancellationToken cancellationToken = default)</code>.</li>
<li>Removed <code>\t</code> from <code>CsvConfiguration.WhiteSpaceChars</code> as a default.</li>
</ul>
<h3 id="section-27">26.1.0</h3>
<h4 id="features-10">Features</h4>
<ul>
<li>Allow schema of destination table to be specified in CsvDataReader.</li>
</ul>
<h3 id="section-28">26.0.1</h3>
<h4 id="bug-fixes-21">Bug Fixes</h4>
<ul>
<li>Fixed issue with constant not working when the field is missing.</li>
</ul>
<h3 id="section-29">26.0.0</h3>
<h4 id="features-11">Features</h4>
<ul>
<li>Added configuration for <code>ExceptionMessagesContainRawData</code> that defaults to true.</li>
</ul>
<h4 id="bug-fixes-22">Bug Fixes</h4>
<ul>
<li>Removed all <code>init</code> properties. These were causing people too many problems.</li>
<li>Fixed issue with exception message not containing the header record.</li>
</ul>
<h4 id="breaking-changes-7">Breaking Changes</h4>
<ul>
<li>Added <code>bool IParserConfiguration.ExceptionMessagesContainRawData { get; }</code>.</li>
<li>Added <code>bool IWriterConfiguration.ExceptionMessagesContainRawData { get; }</code>.</li>
<li>All delegate args objects have <code>init</code> removed and now have constructors with parameters.
<ul>
<li>BadDataFound</li>
<li>ConvertFromString</li>
<li>GetConstructor</li>
<li>GetDynamicPropertyName</li>
<li>HeaderValidated</li>
<li>MissingFieldFound</li>
<li>PrepareHeaderForMatch</li>
<li>ReadingExceptionOccurred</li>
<li>ReferenceHeaderPrefix</li>
<li>ShouldQuote</li>
<li>ShouldSkipRecord</li>
<li>ShouldUseConstructorParameter</li>
<li>Validate</li>
</ul>
</li>
</ul>
<h3 id="section-30">25.0.0</h3>
<h4 id="bug-fixes-23">Bug Fixes</h4>
<ul>
<li>Fixed stack overflow issue with accessing Parser[int] or Parser.Record in BaddataFound callback. Throws an exception explaining issue now.</li>
</ul>
<h4 id="breaking-changes-8">Breaking Changes</h4>
<ul>
<li>All delegate args had their non-parameterless constructor removed in favor of using <code>init</code>.</li>
</ul>
<h3 id="section-31">24.0.1</h3>
<h4 id="bug-fixes-24">Bug Fixes</h4>
<ul>
<li>Fixed issue with Trimming all white space.</li>
</ul>
<h3 id="section-32">24.0.0</h3>
<h4 id="features-12">Features</h4>
<ul>
<li>Added <code>CancellationToken</code> to reading and writing async methods.</li>
</ul>
<h4 id="bug-fixes-25">Bug Fixes</h4>
<ul>
<li>Fixed issue with <code>ShouldQuote</code> not having the correct field type when writing records instead of fields.</li>
<li>Fixed issue with <code>CharCount</code> and <code>ByteCount</code> when trimming.</li>
</ul>
<h4 id="breaking-changes-9">Breaking Changes</h4>
<ul>
<li><code>void IWriterRow.WriteConvertedField(string field)</code> -&gt; <code>void IWriterRow.WriteConvertedField(string field, Type fieldType)</code></li>
<li><code>void CsvWriter.WriteConvertedField(string field)</code> -&gt; <code>void CsvWriter.WriteConvertedField(string field, Type fieldType)</code></li>
</ul>
<h3 id="section-33">23.0.0</h3>
<h4 id="features-13">Features</h4>
<ul>
<li>Changed public <code>init</code> properties to <code>set</code>. Once VB.NET implements <code>init</code>, it can change back.</li>
<li>Made method <code>CsvWriter.WriteBuffer</code> protected so sub classes can write fields.</li>
<li><code>CsvWriter.Flush</code> and <code>CsvWriter.FlushAsync</code> will now flush the underlying <code>TextWriter</code>.</li>
<li>Changed all <code>delegate</code> methods to accept an args <code>struct</code> instead of parameters. This makes it easier to understand what parameters are passed in, and allows for additional parameters to be added later without a breaking change.</li>
</ul>
<h4 id="breaking-changes-10">Breaking Changes</h4>
<ul>
<li>Removed the large <code>CsvConfiguration</code> constructor. The properties are now settable, so this isn't needed for VB.NET.</li>
<li>All delegates now take in a single struct argument.
<ul>
<li>BadDataFound</li>
<li>ConvertFromString</li>
<li>GetConstructor</li>
<li>GetDynamicPropertyName</li>
<li>HeaderValidated</li>
<li>MissingFieldFound</li>
<li>PrepareHeaderForMatch</li>
<li>ReadingExceptionOccurred</li>
<li>ReferenceHeaderPrefix</li>
<li>ShouldQuote</li>
<li>ShouldSkipRecord</li>
<li>ShouldUseConstructorParameter</li>
<li>Validate</li>
</ul>
</li>
</ul>
<h3 id="section-34">22.1.2</h3>
<h4 id="bug-fixes-26">Bug Fixes</h4>
<ul>
<li>Fixed issue with data corruption when parser buffer ran out in middle of escape and quote.</li>
</ul>
<h3 id="section-35">22.1.1</h3>
<h4 id="bug-fixes-27">Bug Fixes</h4>
<ul>
<li>Fixed issue where CsvConfiguration.NewLine was being set when value is null in constructor causing IsNewLine to be true.</li>
</ul>
<h3 id="section-36">22.1.0</h3>
<h4 id="features-14">Features</h4>
<ul>
<li>Added <code>[EnumIgnoreAttribute]</code>.</li>
</ul>
<h3 id="bug-fixes-28">Bug Fixes</h3>
<ul>
<li>Fixed issue with <code>EnumIgnoreCase</code> value not making it to the converter when reading.</li>
</ul>
<h3 id="section-37">22.0.0</h3>
<h4 id="features-15">Features</h4>
<ul>
<li>Changed <code>ParserMode</code> to <code>CsvMode</code> and added the modes to <code>CsvWriter</code>.</li>
<li>Added <code>Type fieldType</code> parameter to <code>ShouldQuote</code> delegate.</li>
<li>Added <code>TypeConverterOptions.EnumIgnoreCase</code> (default is false). Allows <code>EnumConverter</code> to ignore case when matching enum names, values, or <code>NameAttribute</code>.</li>
</ul>
<h4 id="bug-fixes-29">Bug Fixes</h4>
<ul>
<li>Fixed issue with <code>EnumConverter</code> when duplicate names or values appeared in an Enum.</li>
</ul>
<h4 id="breaking-changes-11">Breaking Changes</h4>
<ul>
<li><code>ParserMode</code> -&gt; <code>CsvMode</code></li>
<li>Added <code>IParserConfiguration.ProcessFieldBufferSize</code>.</li>
<li>Added <code>IWriterConfiguration.Mode</code>.</li>
<li><code>ShouldQuote(string, IWriterRow)</code> -&gt; <code>ShouldQuote(string, Type, IWriterRow)</code>.</li>
<li><code>EnumConverter</code> was changed to case sensitive by default.</li>
</ul>
<h3 id="section-38">21.3.1</h3>
<h4 id="bug-fixes-30">Bug Fixes</h4>
<ul>
<li>Fixed issue with CsvContext not being passed into AutoMap.</li>
</ul>
<h3 id="section-39">21.3.0</h3>
<h4 id="features-16">Features</h4>
<ul>
<li>Added back Excel compatibility for bad data fallback.
<ol>
<li>If a field doesn't start with a <code>Quote</code>, read until a <code>Delimiter</code> or <code>NewLine</code> is found.</li>
<li>If in quoted field and a <code>Quote</code> is found that isn't preceded by an <code>Escape</code>, read until a <code>Delimiter or </code>NewLine` is found.</li>
<li><code>TrimOptions.Trim</code> will be applied before these rules.</li>
</ol>
</li>
</ul>
<h3 id="section-40">21.2.1</h3>
<h4 id="bug-fixes-31">Bug Fixes</h4>
<ul>
<li>Fixed issue with processed field buffer not being large enough on resize.</li>
</ul>
<h3 id="section-41">21.2.0</h3>
<h4 id="features-17">Features</h4>
<ul>
<li>Process boolean and null type converter options when writing.</li>
</ul>
<h3 id="section-42">21.1.2</h3>
<h4 id="bug-fixes-32">Bug Fixes</h4>
<ul>
<li>Fixed parsing issue with state not being reset when buffer is filled in the middle of a state.</li>
</ul>
<h3 id="section-43">21.1.1</h3>
<h4 id="bug-fixes-33">Bug Fixes</h4>
<ul>
<li>Fixed parsing issue with buffer ending in the middle of a line ending.</li>
</ul>
<h3 id="section-44">21.1.0</h3>
<h4 id="features-18">Features</h4>
<ul>
<li>Added ParserMode.NoEscape. This will ignore quotes and escape characters.</li>
</ul>
<h3 id="section-45">21.0.6</h3>
<h4 id="bug-fixes-34">Bug Fixes</h4>
<ul>
<li>Fixed issue with writing a field that is larger then 2x the buffer size.</li>
</ul>
<h3 id="section-46">21.0.5</h3>
<h4 id="bug-fixes-35">Bug Fixes</h4>
<ul>
<li>Fixed issue with VB not being able to set <code>init</code> properties on CsvConfiguration by adding a constructor that takes in all properties as optional named arguments.</li>
</ul>
<h3 id="section-47">21.0.4</h3>
<h4 id="bug-fixes-36">Bug Fixes</h4>
<ul>
<li>Fixed issue with cache miss in on both the reader and writer.</li>
</ul>
<h3 id="section-48">21.0.3</h3>
<p>No changes.</p>
<h3 id="section-49">21.0.2</h3>
<h4 id="bug-fixes-37">Bug Fixes</h4>
<ul>
<li>Fixed issue with <code>CsvConfiguration.NewLine</code> not defaulting to '\r\n'.</li>
</ul>
<h3 id="section-50">21.0.1</h3>
<h4 id="big-fixes">Big Fixes</h4>
<ul>
<li>Fixed issue with <code>CsvWriter</code> not keeping track of <code>Row</code> and <code>Index</code>.</li>
</ul>
<h3 id="section-51">21.0.0</h3>
<h4 id="features-19">Features</h4>
<ul>
<li><code>CsvConfiguration.NewLine</code> changed to a <code>string</code>. You can now read and write any string you like for a line ending. This defaults to <code>Environment.NewLine</code>. When reading, if the value is not explicitly set <code>\r\n</code>, <code>\r</code>, or <code>\n</code> will still be used.</li>
</ul>
<h4 id="bug-fixes-38">Bug Fixes</h4>
<ul>
<li>Fixed issue with other platforms than net50 using <code>init</code>.</li>
<li>Fixed issue with being unable to write \r\n in an environment that does use that for <code>Environment.NewLine</code>.</li>
</ul>
<h4 id="breaking-changes-12">Breaking Changes</h4>
<ul>
<li><code>char? CsvConfiguration.NewLine</code> changed to <code>string CsvConfiguration.NewLine</code>.</li>
</ul>
<h3 id="section-52">20.0.0</h3>
<h4 id="features-20">Features</h4>
<ul>
<li>Parser performance.</li>
<li>Writer performance.</li>
<li>Changed CsvConfiguration to a read only <code>record</code> to eliminate threading issues.</li>
<li>Unix parsing mode. Uses escape character instead of field quoting. Configurable <code>NewLine</code>.</li>
<li>Field caching. Disabled by default. When enabled, this will cache all fields created so duplicate fields won't need to create a new string from a character array.</li>
</ul>
<h4 id="breaking-changes-13">Breaking Changes</h4>
<ul>
<li>Removed <code>Caches</code> enum.</li>
<li><code>ReadingContext</code> and <code>WritingContext</code> were merged into a single <code>CsvContext</code>. Anywhere that used either was changed to <code>CsvContext</code>.</li>
<li>All <code>Func</code>s and <code>Action</code>s now have their own <code>delegate</code>.</li>
<li><code>ConvertUsing</code> renamed to <code>Convert</code>.</li>
<li><code>ShouldQuote</code> now takes in <code>IWriterRow</code> instead of <code>CsvContext</code>.</li>
<li><code>CsvConfiguration</code> changed from a <code>class</code> to a <code>record</code>.</li>
<li>All <code>CsvConfiguration</code> properties changed to read only <code>get; init;</code>.</li>
<li><code>CsvConfiguration.NewLine</code> changed to <code>char?</code>.</li>
<li><code>CsvConfiguration.NewLineString</code> removed.</li>
<li><code>CsvConfiguration.RegisterClassMap</code> moved to <code>CsvContext</code>.</li>
<li><code>CsvConfiguration.UnregisterClassMap</code> moved to <code>CsvContext</code>.</li>
<li><code>CsvConfiguration.AutoMap</code> moved to <code>CsvContext</code>.</li>
<li>All <code>IParserConfiguration</code> setters removed.</li>
<li><code>bool IParserConfiguration.CacheFields</code> added.</li>
<li><code>bool IParserConfiguration.LeaveOpen</code> added.</li>
<li><code>char? IParserConfiguration.NewLine</code> added.</li>
<li><code>ParserMode IParserConfiguration.Mode</code> added.</li>
<li><code>IParserConfiguration.IgnoreQuotes</code> removed.</li>
<li><code>char[] IParserConfiguration.WhiteSpaceChars</code> added.</li>
<li>All <code>IReaderConfiguration</code> setters removed.</li>
<li><code>IReaderConfiguration.TypeConverterOptionsCache</code> removed.</li>
<li><code>IReaderConfiguration.TypeConverterCache</code> removed.</li>
<li><code>IReaderConfiguration.Maps</code> removed.</li>
<li><code>IReaderConfiguration.RegisterClassMap</code> removed.</li>
<li><code>IReaderConfiguration.UnregisterClassMap</code> removed.</li>
<li><code>IReaderConfiguration.AutoMap</code> removed.</li>
<li><code>ISerializerConfiguration</code> removed and properties added to <code>IWriterConfiguration</code>.</li>
<li>All <code>IWriterConfiguration</code> setters removed.</li>
<li><code>IWriterConfiguration.QuoteString</code> removed.</li>
<li><code>IWriterConfiguration.TypeConverterCache</code> removed.</li>
<li><code>IWriterConfiguration.MemberTypes</code> removed.</li>
<li><code>IWriterConfiguration.Maps</code> removed.</li>
<li><code>IWriterConfiguration.RegisterClassMap</code> removed.</li>
<li><code>IWriterConfiguration.UnregisterClassMap</code> removed.</li>
<li><code>IWriterConfiguration.AutoMap</code> removed.</li>
<li><code>MemberMap.Optional</code> added.</li>
<li><code>MemberMap&lt;TClass, TMember&gt;.ConvertUsing</code> renamed to <code>Convert</code>.</li>
<li><code>CsvFieldReader</code> removed.</li>
<li><code>CsvParser.Read</code> returns <code>boolean</code> instead of <code>string[]</code>.</li>
<li><code>CsvParser</code> constructors that take in a <code>FieldReader</code> removed.</li>
<li><code>CsvParser[int index]</code> added to retrieve fields after a <code>Read</code>.</li>
<li><code>CsvSerializer</code> removed.</li>
<li><code>IFieldReader</code> removed.</li>
<li><code>IParser.ByteCount</code> added.</li>
<li><code>IParser.CharCount</code> added.</li>
<li><code>IParser.Count</code> added.</li>
<li><code>IParser[int index]</code> added.</li>
<li><code>IParser.Record</code> added.</li>
<li><code>IParser.RawRecord</code> added.</li>
<li><code>IParser.Row</code> added.</li>
<li><code>IParser.RawRow</code> added.</li>
<li><code>IParser.Read</code> returns <code>bool</code> instead of <code>string[]</code>.</li>
<li><code>IParser.ReadAsync</code> returns <code>bool</code> instead of <code>string[]</code>.</li>
<li><code>IReader.Parser</code> removed.</li>
<li><code>int IReaderRow.ColumnCount</code> added.</li>
<li><code>int IReaderRow.CurrentIndex</code> added.</li>
<li><code>string[] IReaderRow.HeaderRecord</code> added.</li>
<li><code>IParser IReaderRow.Parser</code> added.</li>
<li><code>ISerializer</code> removed.</li>
<li><code>string[] IWriterRow.HeaderRecord</code> added.</li>
<li><code>int IWriterRow.Row</code> added.</li>
<li><code>int IWriterRow.Index</code> added.</li>
<li><code>RecordBuilder</code> removed.</li>
</ul>
<h3 id="section-53">19.0.0</h3>
<h4 id="features-21">Features</h4>
<ul>
<li>Added the rest of the mapping and attributes configuration for constructor parameters.</li>
<li>Reading speed improvement.</li>
</ul>
<h4 id="breaking-changes-14">Breaking Changes</h4>
<ul>
<li>Added <code>IParameterMapper</code> to <code>BooleanFalseValuesAttribute</code>, <code>BooleanTrueValuesAttribute</code>, <code>ConstantAttribute</code>, <code>CultureInfoAttribute</code>, <code>DateTimeStylesAttribute</code>, <code>DefaultAttribute</code>, <code>FormatAttribute</code>, <code>HeaderPrefixAttribute</code>, <code>IgnoreAttribute</code>, <code>NameIndexAttribute</code>, <code>NullValuesAttribute</code>, <code>NumberStylesAttribute</code>, <code>OptionalAttribute</code>, and <code>TypeConverterAttribute</code>.</li>
<li>Renamed <code>MapTypeConverterOption</code> to <code>MemberMapTypeConverterOptions</code>.</li>
<li>Renamed <code>TypeConverterOptions.NumberStyle</code> to <code>TypeConverterOptions.NumberStyles</code>.</li>
<li>Removed <code>ReflectionHelper.CreateInstance&lt;T&gt;</code>.</li>
<li>Removed <code>ReflectionHelper.CreateInstance</code>.</li>
<li>Removed <code>ReflectionHelper.CreateInstanceWithoutContractResolver</code>.</li>
</ul>
<h3 id="section-54">18.0.0</h3>
<h4 id="features-22">Features</h4>
<ul>
<li>Added parameter mapping via class map or attributes.</li>
</ul>
<h4 id="breaking-changes-15">Breaking Changes</h4>
<ul>
<li><code>NameAttribute</code> added interface <code>IParameterMapper</code>.</li>
<li><code>IndexAttribute</code> added interface <code>IParameterMapper</code>.</li>
</ul>
<h3 id="section-55">17.0.1</h3>
<h4 id="bug-fixes-39">Bug Fixes</h4>
<ul>
<li>Fixed issue where EnumConverter wasn't working if enum value wasn't an Int32.</li>
</ul>
<h3 id="section-56">17.0.0</h3>
<h4 id="features-23">Features</h4>
<ul>
<li>ValidateHeader will validate all members before calling HeaderValidated.</li>
</ul>
<h4 id="breaking-changes-16">Breaking Changes</h4>
<ul>
<li><code>Action&lt;bool, string[], int, ReadingContext&gt; IReaderConfiguration.HeaderValidated</code> -&gt; <code>Action&lt;InvalidHeader[], ReadingContext&gt; IReaderConfiguration.HeaderValidated</code></li>
<li><code>Action&lt;bool, string[], int, ReadingContext&gt; CsvConfiguration.HeaderValidated</code> -&gt; <code>Action&lt;InvalidHeader[], ReadingContext&gt; CsvConfiguration.HeaderValidated</code></li>
<li><code>ConfigurationFunctions.HeaderValidated</code> signature changed from <code>(bool isValid, string[] headerNames, int headerNameIndex, ReadingContext context)</code> to <code>(InvalidHeader[] invalidHeaders, ReadingContext context)</code></li>
<li><code>CsvReader.ValidateHeader(ClassMap map)</code> -&gt; <code>CsvReader.ValidateHeader(ClassMap map, List&lt;InvalidHeader&gt; invalidHeaders)</code></li>
<li>Removed <code>HeaderValidationException.HeaderNames</code>.</li>
<li>Removed <code>HeaderValidationException.HeaderNameIndex</code>.</li>
<li>Added <code>InvalidHeader[] HeaderValidationException.InvalidHeaders</code>.</li>
</ul>
<h3 id="section-57">16.2.0</h3>
<h4 id="features-24">Features</h4>
<ul>
<li>Added ability to put <code>[Name]</code> attribute on enum values.</li>
<li>Added ability to register a converter for <code>Enum</code> that will be a default for all enum types.</li>
</ul>
<h3 id="section-58">16.1.0</h3>
<h4 id="features-25">Features</h4>
<ul>
<li>GetRecords throws <code>ObjectDisposedException</code> when <code>CsvReader</code> is disposed. A message hint was added to help the user understand what went wrong.</li>
</ul>
<h3 id="section-59">16.0.0</h3>
<h4 id="features-26">Features</h4>
<ul>
<li>Ability to have duplicate header names when using dynamic records.</li>
</ul>
<h4 id="breaking-changes-17">Breaking Changes</h4>
<ul>
<li>Added <code>Func&lt;ReadingContext, int, string&gt; IReaderConfiguration.GetDynamicPropertyName</code>.</li>
<li>Added <code>Func&lt;ReadingContext, int, string&gt; CsvConfiguration.GetDynamicPropertyName</code>.</li>
</ul>
<h3 id="section-60">15.0.10</h3>
<ul>
<li>Fixed <code>IgnoreAttribute</code> to ignore the whole property treey if put on a reference property when auto mapped.</li>
</ul>
<h3 id="section-61">15.0.9</h3>
<h4 id="bug-fixes-40">Bug Fixes</h4>
<ul>
<li>Fixed issue where <code>CsvDataReader.FieldCount</code> was throwing an exception if there were no records.</li>
</ul>
<h3 id="section-62">15.0.8</h3>
<h4 id="bug-fixes-41">Bug Fixes</h4>
<ul>
<li>Fixed <code>CsvDataReader.GetOrdinal</code> issue where it wasn't doing a case-insensitive match after a failed case-sensitive match. Run values through <code>PrepareHeaderForMatch</code>.</li>
</ul>
<h3 id="section-63">15.0.7</h3>
<h4 id="bug-fixes-42">Bug Fixes</h4>
<ul>
<li>Fixed issue where writing <code>null</code> to <code>WriteField</code> didn't output a field.</li>
</ul>
<h3 id="section-64">15.0.6</h3>
<h4 id="bug-fixes-43">Bug Fixes</h4>
<ul>
<li>Fixed test not building.</li>
</ul>
<h3 id="section-65">15.0.5</h3>
<h4 id="bug-fixes-44">Bug Fixes</h4>
<ul>
<li>Fixed issue with multiple character delimiter not working when the first char of the delimiter precedes the actual delimiter.</li>
</ul>
<h3 id="section-66">15.0.4</h3>
<h4 id="bug-fixes-45">Bug Fixes</h4>
<ul>
<li>Fixed issue with <code>ReflectionHelper</code> caching not always unique.</li>
</ul>
<h3 id="section-67">15.0.3</h3>
<h4 id="bug-fixes-46">Bug Fixes</h4>
<ul>
<li>Updated default number styles for <code>DecimalConverter</code> and <code>DoubleConverter</code> to match MS's recommendations.</li>
</ul>
<h3 id="section-68">15.0.2</h3>
<h4 id="bug-fixes-47">Bug Fixes</h4>
<ul>
<li>Fixed issue with <code>DataReader.GetValues</code> not working when column and rows have different count.</li>
</ul>
<h3 id="section-69">15.0.1</h3>
<h3 id="bug-fixes-48">Bug Fixes</h3>
<ul>
<li>Downgraded <code>System.Threading.Tasks.Extensions</code> to 4.5.2 due to loading error of <code>Microsoft.Bcl.AsyncInterfaces</code>.</li>
</ul>
<h3 id="section-70">15.0.0</h3>
<h4 id="features-27">Features</h4>
<ul>
<li>Ignore attribute on a reference will ignore all properties on that reference.</li>
</ul>
<h4 id="breaking-changes-18">Breaking Changes</h4>
<ul>
<li>Added <code>IMemberReferenceMapper</code> to <code>IgnoreAttribute</code>.</li>
</ul>
<h3 id="section-71">14.0.0</h3>
<h4 id="features-28">Features</h4>
<ul>
<li>Added <code>IAsyncDispose</code> on writing classes.</li>
</ul>
<h4 id="breaking-changes-19">Breaking Changes</h4>
<ul>
<li>Added dependency <code>&lt;PackageReference Include=&quot;System.Threading.Tasks.Extensions&quot; Version=&quot;4.5.3&quot; /&gt;</code> to <code>net45</code>.</li>
<li>Added dependency <code>&lt;PackageReference Include=&quot;System.Threading.Tasks.Extensions&quot; Version=&quot;4.5.3&quot; /&gt;</code> to <code>net47</code>.</li>
<li>Added dependency <code>&lt;PackageReference Include=&quot;System.Threading.Tasks.Extensions&quot; Version=&quot;4.5.3&quot; /&gt;</code> to <code>netstandard2.0</code>.</li>
<li><code>IWriter</code> added interface <code>IAsyncDisposable</code> for <code>net47</code> and <code>netstandard2.1</code>.</li>
<li><code>ISerializer</code> added interface <code>IAsyncDisposable</code> for <code>net47</code> and <code>netstandard2.1</code>.</li>
<li><code>WritingContext</code> added interface <code>IAsyncDisposable</code> for <code>net47</code> and <code>netstandard2.1</code>.</li>
<li><code>CsvWriter</code> added methods <code>public async ValueTask DisposeAsync()</code> and <code>protected virtual async ValueTask DisposeAsync(bool disposing)</code> for <code>net47</code> and <code>netstandard</code>.</li>
<li><code>CsvSerializer</code> added methods <code>public async ValueTask DisposeAsync()</code> and <code>protected virtual async ValueTask DisposeAsync(bool disposing)</code> for <code>net47</code> and <code>netstandard</code>.</li>
<li><code>WritingContext</code> added methods <code>public async ValueTask DisposeAsync()</code> and <code>protected virtual async ValueTask DisposeAsync(bool disposing)</code> for <code>net47</code> and <code>netstandard</code>.</li>
</ul>
<h3 id="section-72">13.0.0</h3>
<h4 id="features-29">Features</h4>
<ul>
<li>Added <code>netstandard2.1</code> build.</li>
<li>Added required CultureInfo parameter to any class that uses CultureInfo.</li>
<li>Apply member attributes using interface instead of hard coding.</li>
<li>Added customizable new line when writing. You can choose from <code>CRLF</code>, <code>CR</code>, <code>LF</code>, or <code>Environment.NewLine</code>.</li>
<li>Renamed <code>Configuration</code> to <code>CsvConfiguration</code> to avoid namespace conflicts.</li>
<li>Added <code>GetRecordsAsync</code> and <code>WriteRecordsAsync</code>.</li>
</ul>
<h4 id="breaking-changes-20">Breaking Changes</h4>
<ul>
<li>Removed dependency <code>&lt;PackageReference Include=&quot;System.Reflection.TypeExtensions&quot; Version=&quot;4.4.0&quot; /&gt;</code> from <code>netstandard2.0</code>.</li>
<li>Removed dependency <code>&lt;PackageReference Include=&quot;System.Reflection.TypeExtensions&quot; Version=&quot;4.4.0&quot; /&gt;</code> from <code>netstandard2.1</code>.</li>
<li>Added dependency <code>&lt;PackageReference Include=&quot;Microsoft.Bcl.AsyncInterfaces&quot; Version=&quot;1.1.0&quot; /&gt;</code> to <code>net47</code>.</li>
<li>Added dependency <code>&lt;PackageReference Include=&quot;Microsoft.Bcl.AsyncInterfaces&quot; Version=&quot;1.1.0&quot; /&gt;</code> to <code>netstandard2.0</code>.</li>
<li><code>ClassMap.AutoMap()</code> -&gt; <code>ClassMap.AutoMap(CultureInfo)</code></li>
<li><code>CsvParser.CsvParser(TextReader)</code> -&gt; <code>CsvParser.CsvParser(TextReader, CultureInfo)</code></li>
<li><code>CsvParser.CsvParser(TextReader, bool)</code> -&gt; <code>CsvParser.CsvParser(TextReader, CultureInfo, bool)</code></li>
<li><code>CsvReader.CsvReader(TextReader)</code> -&gt; <code>CsvReader.CsvReader(TextReader, CultureInfo)</code></li>
<li><code>CsvReader.CsvReader(TextReader, bool)</code> -&gt; <code>CsvReader.CsvReader(TextReader, CultureInfo, bool)</code></li>
<li><code>CsvSerializer.CsvSerializer(TextWriter)</code> -&gt; <code>CsvSerializer.CsvSerializer(TextWriter, CultureInfo)</code></li>
<li><code>CsvSerializer.CsvSerializer(TextWriter, bool)</code> -&gt; <code>CsvSerializer.CsvSerializer(TextWriter, CultureInfo, bool)</code></li>
<li><code>CsvWriter.CsvWriter(TextWriter)</code> -&gt; <code>CsvWriter.CsvWriter(TextWriter, CultureInfo)</code></li>
<li><code>CsvWriter.CsvWriter(TextWriter, bool)</code> -&gt; <code>CsvWriter.CsvWriter(TextWriter, CultureInfo, bool)</code></li>
<li><code>Factory.CreateParser(TextReader)</code> -&gt; <code>Factory.CreateParser(TextReader, CultureInfo)</code></li>
<li><code>Factory.CreateReader(TextReader)</code> -&gt; <code>Factory.CreateReader(TextReader, CultureInfo)</code></li>
<li><code>Factory.CreateWriter(TextWriter)</code> -&gt; <code>Factory.CreateWriter(TextWriter, CultureInfo)</code></li>
<li><code>IFactory.CreateParser(TextReader)</code> -&gt; <code>IFactory.CreateParser(TextReader, CultureInfo)</code></li>
<li><code>IFactory.CreateReader(TextReader)</code> -&gt; <code>IFactory.CreateReader(TextReader, CultureInfo)</code></li>
<li><code>IFactory.CreateWriter(TextWriter)</code> -&gt; <code>IFactory.CreateWriter(TextWriter, CultureInfo)</code></li>
<li>Added <code>ISerializerConfiguration.NewLine</code>.</li>
<li>Added <code>ISerializerConfiguration.NewLineString</code>.</li>
<li>Added <code>Configuration.NewLine</code>.</li>
<li>Added <code>Configuration.NewLineString</code>.</li>
<li>Removed <code>Configuration.Configuration()</code> parameterless constructor.</li>
<li>Attributes now require the use of <code>IMemberMapper</code> or <code>IMemberReferenceMapper</code> to be loaded. All existing attributes added these and implemented the interface.</li>
<li>Renamed <code>Configuration</code> to <code>CsvConfiguration</code>.</li>
<li>Added <code>IAsyncEnumerable&lt;T&gt; CsvReader.GetRecordsAsync&lt;T&gt;()</code></li>
<li>Added <code>IAsyncEnumerable&lt;T&gt; CsvReader.GetRecordsAsync&lt;T&gt;(T anonymousTypeDefinition)</code></li>
<li>Added <code>IAsyncEnumerable&lt;object&gt; CsvReader.GetRecordsAsync(Type type)</code></li>
<li>Added <code>IAsyncEnumerable&lt;T&gt; CsvReader.EnumerateRecordsAsync&lt;T&gt;(T record)</code></li>
<li>Added <code>Task CsvWriter.WriteRecordsAsync(IEnumerable records)</code></li>
<li>Added <code>Task CsvWriter.WriteRecordsAsync&lt;T&gt;(IEnumerable&lt;T&gt; records)</code></li>
<li>Added <code>IAsyncEnumerable&lt;T&gt; IReader.GetRecordsAsync&lt;T&gt;()</code></li>
<li>Added <code>IAsyncEnumerable&lt;T&gt; IReader.GetRecordsAsync&lt;T&gt;(T anonymousTypeDefinition)</code></li>
<li>Added <code>IAsyncEnumerable&lt;object&gt; IReader.GetRecordsAsync(Type type)</code></li>
<li>Added <code>IAsyncEnumerable&lt;T&gt; IReader.EnumerateRecordsAsync&lt;T&gt;(T record)</code></li>
<li>Added <code>Task IWriter.WriteRecordsAsync(IEnumerable records)</code></li>
<li>Added <code>Task IWriter.WriteRecordsAsync&lt;T&gt;(IEnumerable&lt;T&gt; records)</code></li>
</ul>
<h3 id="section-73">12.3.2</h3>
<h4 id="bug-fixes-49">Bug Fixes</h4>
<ul>
<li>Changed double and single converters to only test for format &quot;R&quot; if the user hasn't supplied a format.</li>
</ul>
<h3 id="section-74">12.3.1</h3>
<h4 id="bug-fixes-50">Bug Fixes</h4>
<ul>
<li>Fix for bug in .NET Framework that causes a StackOverflowException. This needs to be changed back eventually.</li>
</ul>
<h3 id="section-75">12.3.0</h3>
<h4 id="features-30">Features</h4>
<ul>
<li>Added UriConverter.</li>
</ul>
<h3 id="section-76">12.2.3</h3>
<h4 id="big-fixes-1">Big Fixes</h4>
<ul>
<li>Changed round trip default format to test if &quot;R&quot; works and use backup of &quot;G9&quot; for float and &quot;G17&quot; for double.</li>
</ul>
<h3 id="section-77">12.2.2</h3>
<h4 id="bug-fixes-51">Bug Fixes</h4>
<ul>
<li>Fixed issue where multiple properties with the same name were used when a child class property hides a parent class property using the new modifier.</li>
<li>Fixed issue where a null reference exception was thrown when writing and all properties are ignored.</li>
</ul>
<h3 id="section-78">12.2.1</h3>
<h4 id="bug-fixes-52">Bug Fixes</h4>
<ul>
<li>Fixed issue where an &quot;Index out of bounds of the array&quot; exception was happening on TryGetField of type DateTime.</li>
<li>Fix <code>RawRecord</code> adding spaces if <code>TrimOptions.Trim</code> is used.</li>
</ul>
<h3 id="section-79">12.2.0</h3>
<h4 id="features-31">Features</h4>
<ul>
<li>Allow default value when using optional members.</li>
<li>Added BigIntConverter.</li>
<li>Mapping to member with type <code>Type</code> will throw exception by default.</li>
</ul>
<h4 id="bug-fixes-53">Bug Fixes</h4>
<ul>
<li>Made SingleConverter and DoubleConverter round-trip-able.</li>
</ul>
<h3 id="section-80">12.1.3</h3>
<h4 id="bug-fixes-54">Bug Fixes</h4>
<ul>
<li>Always write \r\n line endings to be compliant with RFC 4180.</li>
</ul>
<h3 id="section-81">12.1.2</h3>
<h4 id="bug-fixes-55">Bug Fixes</h4>
<ul>
<li>Fixed issue where CsvDataReader would skip the first row when there is no header record.</li>
<li>Fixed CsvDataReader issue where null values weren't being represented as DBNull.Value on GetValue and GetValues methods.</li>
<li>Fixed issue with IsDBNull method where an empty string was considered a null.</li>
</ul>
<h3 id="section-82">12.1.1</h3>
<h4 id="bug-fixes-56">Bug Fixes</h4>
<ul>
<li>Fixed issue where <code>CsvReader.ReadAsync</code> wasn't behaving the same as <code>CsvReader.Read</code>.</li>
</ul>
<h3 id="section-83">12.1.0</h3>
<h4 id="features-32">Features</h4>
<ul>
<li>Added constructor to <code>Configuration</code> to pass in the <code>CultureInfo</code>. When passing a culture in, the <code>Delimiter</code> will be set to <code>CultureInfo.TextInfo.ListSeparator</code>.</li>
</ul>
<h3 id="section-84">12.0.1</h3>
<h4 id="bug-fixes-57">Bug Fixes</h4>
<ul>
<li>Fixed issue where writing a dynamic object would still sort the header when no sort was specified.</li>
</ul>
<h3 id="section-85">12.0.0</h3>
<h4 id="features-33">Features</h4>
<ul>
<li>Added config option for sorting dynamic object properties when writing. Defaults to property value set order.</li>
</ul>
<h4 id="breaking-changes-21">Breaking Changes</h4>
<ul>
<li>Added <code>IComparer&lt;string&gt; IWriterConfiguration.DynamicPropertySort</code>.</li>
<li>Added <code>IComparer&lt;string&gt; Configuration.DynamicPropertySort</code>.</li>
</ul>
<h3 id="section-86">11.0.1</h3>
<h4 id="bug-fixes-58">Bug Fixes</h4>
<ul>
<li>Fixed issue with leaveOpen not being used in the context's dispose.</li>
</ul>
<h3 id="section-87">11.0.0</h3>
<h4 id="features-34">Features</h4>
<ul>
<li>Removed config options <code>QuoteAllFields</code>, <code>QuoteNoFields</code>, <code>QuoteRequiredChars</code>, and <code>BuildREquiredQuoteChars</code> in favor of <code>ShouldQuote</code> function.</li>
</ul>
<h4 id="breaking-changes-22">Breaking Changes</h4>
<ul>
<li>Removed <code>IWriterConfiguration.QuoteAllFields</code>.</li>
<li>Removed <code>IWriterConfiguration.QuoteNoFields</code>.</li>
<li>Removed <code>IWriterConfiguration.QuoteRequiredChars</code>.</li>
<li>Removed <code>IWriterConfiguration.BuildRequiredQuoteChars</code>.</li>
<li>Removed <code>Configuration.QuoteAllFields</code>.</li>
<li>Removed <code>Configuration.QuoteNoFields</code>.</li>
<li>Removed <code>Configuration.QuoteRequiredChars</code>.</li>
<li>Removed <code>Configuration.BuildRequiredQuoteChars</code>.</li>
<li>Added <code>Func&lt;string, WritingContext, bool&gt; IWriterConfiguration.ShouldQuote</code>.</li>
<li>Added <code>Func&lt;string, WritingContext, bool&gt; Configuration.ShouldQuote</code>.</li>
</ul>
<h3 id="section-88">10.0.0</h3>
<h4 id="features-35">Features</h4>
<ul>
<li>Added a more friendly header validation message.</li>
<li>Separated header and field validation exceptions.</li>
<li>Added data properties to validation classes.</li>
<li>Changed Configuration.ReadingExceptionOccurred to not throw an exception and return a boolean whether it should throw an exception. The caller will throw if true.</li>
<li>Changed <code>NamedIndexCache</code> type from <code>Tuple&lt;string, int&gt;</code> to <code>(string, int)</code>.</li>
<li>Config option to consider a line break in a quoted field as bad data.</li>
<li>Changed delimiter default value from ',' to CultureInfo.CurrentCulture.TextInfo.ListSeparator.</li>
<li>PrepareHeaderForMatch now passes in the header name and index.</li>
<li>Dynamic records will now have null properties for missing fields.</li>
<li>Write ExpandoObject and IDynamicMetaObjectProvider object properties in ascending order to ensure order of property creation doesn't matter.</li>
<li>Added escape character configuration.</li>
<li>Added IDataReader implementation. This allows for easily loading a DataTable.</li>
</ul>
<h3 id="breaking-changes-23">Breaking Changes</h3>
<ul>
<li><code>ValidationException</code> is now <code>abstract</code>.</li>
<li><code>IReaderConfiguration.ReadingExceptionOccurred</code> type changed from <code>Action&lt;CsvHelperException&gt;</code> to <code>Func&lt;CsvHelperException, bool&gt;</code>.</li>
<li><code>Configuration.ReadingExceptionOccurred</code> type changed from <code>Action&lt;CsvHelperException&gt;</code> to <code>Func&lt;CsvHelperException, bool&gt;</code>.</li>
<li>Changed <code>NamedIndexCache</code> type from <code>Tuple&lt;string, int&gt;</code> to <code>(string, int)</code>. This adds a dependency to <code>System.ValueTuple</code> on .NET 4.5.</li>
<li>Added <code>bool IParserConfiguration.LineBreakInQuotedFieldIsBadData</code>.</li>
<li>Added <code>bool Configuration.LineBreakInQuotedFieldIsBadData</code>.</li>
<li>Changed <code>IReaderConfiguration.PrepareHeaderForMatch</code> type from <code>Func&lt;string, string&gt;</code> to <code>Func&lt;string, int, string&gt;</code>.</li>
<li>Changed <code>Configuration.PrepareHeaderForMatch</code> type from <code>Func&lt;string, string&gt;</code> to <code>Func&lt;string, int, string&gt;</code>.</li>
<li>Added <code>char ISerializerConfiguration.Escape</code>.</li>
<li>Added <code>char IParserConfiguration.Escape</code>.</li>
<li>Added <code>char Configuration.Escape</code>.</li>
</ul>
<h3 id="section-89">9.2.3</h3>
<h4 id="bug-fixes-59">Bug Fixes</h4>
<ul>
<li>Fixed issue where TrimOptions.InsideQuotes would fail when there were escaped quotes in the field.</li>
</ul>
<h3 id="section-90">9.2.2</h3>
<h4 id="bug-fixes-60">Bug Fixes</h4>
<ul>
<li>Fixed issue where NamedIndexes wasn't being reset on ReadHeader call.</li>
</ul>
<h3 id="section-91">9.2.1</h3>
<h4 id="bug-fixes-61">Bug Fixes</h4>
<ul>
<li>Fixed issue where a TypeConverterAttribute isn't being used when on a reference.</li>
</ul>
<h3 id="section-92">9.2.0</h3>
<h4 id="features-36">Features</h4>
<ul>
<li>More clear exception messages when reading and a missing field is found.</li>
</ul>
<h3 id="section-93">9.1.0</h3>
<h4 id="features-37">Features</h4>
<ul>
<li>Allow parameterless constructor on classes and reference property classes when auto mapping.</li>
</ul>
<h3 id="section-94">9.0.2</h3>
<h4 id="bug-fixes-62">Bug Fixes</h4>
<ul>
<li>Fixed issue where <code>WriteAsync</code> wasn't calling <code>SanitizeForInjection</code>.</li>
</ul>
<h3 id="section-95">9.0.1</h3>
<h4 id="bug-fixes-63">Bug Fixes</h4>
<ul>
<li>Fixed issue where <code>leaveOpen</code> parameter in <code>CsvParser</code> constructor was hard coded.</li>
<li>Fixed issue where header validation was being ran on properties that only had an index mapped.</li>
</ul>
<h3 id="section-96">9.0.0</h3>
<p>This release contains changes from 8.3.0 and 8.2.0.</p>
<h3 id="section-97">8.3.0</h3>
<p>This has been unlisted in nuget because of a breaking change before it. The changes are in 9.0.0.</p>
<h4 id="features-38">Features</h4>
<ul>
<li>Removed restriction that was disallowing the null char '\0' to be used as a delimiter.</li>
</ul>
<h3 id="section-98">8.2.0</h3>
<p>This has been unlisted in nuget because of a breaking change. The changes are in 9.0.0.</p>
<h4 id="features-39">Features</h4>
<ul>
<li>Added Optional config to factory builder.</li>
<li>Added <code>OptionalAttribute</code>.</li>
</ul>
<h4 id="breaking-changes-24">Breaking Changes</h4>
<ul>
<li>Added <code>IHasMapOptions : IHasOptional</code>.</li>
<li>Added <code>MemberMapBuilder : IHasOptional</code>.</li>
<li>Added <code>MemberMapBuilder : IHasOptionalOptions</code>.</li>
</ul>
<h3 id="section-99">8.1.1</h3>
<h4 id="features-40">Features</h4>
<ul>
<li>Configuration functions are available on a static class <code>ConfigurationFunctions</code>.</li>
</ul>
<h4 id="bug-fixes-64">Bug Fixes</h4>
<ul>
<li>Fixed issue where <code>IgnoreBlankLines</code> wasn't being checked in <code>GetField&lt;T&gt;(int index, ITypeConverter converter)</code>.</li>
</ul>
<h3 id="section-100">8.1.0</h3>
<h4 id="features-41">Features</h4>
<ul>
<li>Added <code>IsOptional</code> mapping option.</li>
</ul>
<h3 id="section-101">8.0.0</h3>
<h4 id="features-42">Features</h4>
<ul>
<li>Added Unity build.</li>
<li>Added <code>IsOptional</code> mapping option.</li>
</ul>
<h4 id="bug-fixes-65">Bug Fixes</h4>
<ul>
<li>Added missing interface methods to configs.</li>
<li>Fixed issue with parsing when only CR is used and fields are quoted.</li>
<li>Fixed issue where <code>GetField</code> was calling the <code>ObjectResolver</code>.</li>
<li>Made the contexts not serializable in exceptions.</li>
<li>Fixed issue with <code>ObjectResolver</code> fallback causing a <code>StackOverflowException</code>.</li>
</ul>
<h4 id="breaking-changes-25">Breaking Changes</h4>
<ul>
<li>Added <code>IReaderConfiguration.IgnoreReferences</code>.</li>
<li>Added <code>IWriterConfiguration.IgnoreReferences</code>.</li>
</ul>
<h3 id="section-102">7.1.1</h3>
<h4 id="bug-fixes-66">Bug Fixes</h4>
<ul>
<li>Added constructor to <code>CsvWriter</code> that allows for <code>leaveOpen</code> to be set.</li>
<li>Made <code>CsvWriter.Dispos</code>e able to be called multiple times.</li>
<li>Added <code>ConfigureAwait(false)</code> to all async calls.</li>
</ul>
<h3 id="section-103">7.1.0</h3>
<h4 id="features-43">Features</h4>
<ul>
<li>Changed record object creation to use the <code>ObjectResolver</code>.</li>
</ul>
<h3 id="section-104">7.0.1</h3>
<h4 id="bug-fixes-67">Bug Fixes</h4>
<ul>
<li>Allow private constructors to be used to instantiate new class instances.</li>
</ul>
<h3 id="section-105">7.0.0</h3>
<h4 id="features-44">Features</h4>
<ul>
<li>Reading performance improvements.</li>
</ul>
<h4 id="breaking-changes-26">Breaking Changes</h4>
<ul>
<li>Removed <code>IReadingContext</code> and <code>IWritingContext</code> interfaces. <code>ReadingContext</code> and <code>WritingContext</code> are used directly now.</li>
</ul>
<h3 id="section-106">6.1.1</h3>
<h4 id="bug-fixes-68">Bug Fixes</h4>
<ul>
<li>Fixed issue with circular references when auto mapping.</li>
</ul>
<h3 id="section-107">6.1.0</h3>
<h4 id="features-45">Features</h4>
<ul>
<li>Dynamic now uses <code>Configuration.PrepareHeaderForMatch</code> on header name to get property name for dynamic object.</li>
</ul>
<h3 id="section-108">6.0.3</h3>
<h4 id="bug-fixes-69">Bug Fixes</h4>
<ul>
<li>Fixed issue with LINQPad not working properly due to types from differently assemblies being cached in the writer.</li>
</ul>
<h4 id="breaking-changes-27">Breaking Changes</h4>
<ul>
<li><code>IWritingContext.TypeActions</code> signature changed.</li>
</ul>
<h3 id="section-109">6.0.2</h3>
<h4 id="bug-fixes-70">Bug Fixes</h4>
<ul>
<li>Fixed issue with LINQPad not working properly due to types from differently assemblies being cached.</li>
</ul>
<h3 id="section-110">6.0.0</h3>
<h4 id="features-46">Features</h4>
<ul>
<li>Use <code>ObjectResolver</code> to create internal classes <code>RecordManager</code>, <code>ExpressionManager</code>, <code>RecordCreatorFactory</code>, and <code>RecordHydrator</code>, <code>RecordWriterFactory</code>.</li>
<li>Added generic resolve method to object resolver.</li>
<li>Added mapping methods to MemberMap for use during runtime mapping.</li>
<li>Added more info and properties to TypeConverterException.</li>
</ul>
<h4 id="bug-fixes-71">Bug Fixes</h4>
<ul>
<li>Fixed issue where mapping an interface doesn't get used when writing.</li>
</ul>
<h4 id="breaking-changes-28">Breaking Changes</h4>
<ul>
<li>Added <code>IObjectResolver.Resolve&lt;T&gt;( params object[] constructorArgs )</code> method.</li>
<li>Added <code>IWriter.WriteRecords&lt;T&gt;( IEnumerable&lt;T&gt; records )</code> method.</li>
<li><code>TypeConverterException</code> constructors signatures changed.</li>
</ul>
<h3 id="section-111">5.0.0</h3>
<h4 id="features-47">Features</h4>
<ul>
<li>Added <code>Map&lt;TClass&gt;.References( expression )</code> back in.</li>
</ul>
<h4 id="bug-fixes-72">Bug Fixes</h4>
<ul>
<li>Fixed <code>DefaultTypeConverterException</code> message. The generated message wasn't being used.</li>
</ul>
<h3 id="section-112">4.0.3</h3>
<h4 id="bug-fixes-73">Bug Fixes</h4>
<ul>
<li>Added <code>ReadingExceptionOccurred</code> callback to <code>GetRecord</code> methods when an exception occurs.</li>
</ul>
<h3 id="section-113">4.0.2</h3>
<h4 id="bug-fixes-74">Bug Fixes</h4>
<ul>
<li>Fixed issue with parsing when buffer spans over a field.</li>
</ul>
<h3 id="section-114">4.0.1</h3>
<h4 id="bug-fixes-75">Bug Fixes</h4>
<ul>
<li>Fixed issue where trimming inside quotes would fail when the character after a space was a delimiter, \r, or \n.</li>
</ul>
<h3 id="section-115">4.0.0</h3>
<h4 id="breaking-changes-29">Breaking Changes</h4>
<ul>
<li>Added setter to <code>ISerializerConfiguration.Quote</code>.</li>
<li>Removed <code>ClassMap&lt;TClass&gt;.References( expression, constructorArs )</code>. Use sub property mapping instead.</li>
<li>Removed <code>ClassMap&lt;TClass&gt;.ConstructUsing( expression ). Use the </code>ObjectResolver` instead.</li>
<li>Change how reference header prefixing works.</li>
<li>Changed <code>Configuration</code>/<code>IReaderConfiguration</code>/<code>IWriterConfiguration</code> <code>bool PrefixReferenceHeaders</code> to <code>Func&lt;Type, string, string&gt; ReferenceHeaderPrefix</code>. The function takes in the member type and member name and returns the prefix.</li>
<li>Removed <code>MemberReferenceMap.Prefix()</code> method.</li>
<li>Removed <code>ParameterReferenceMap.Prefix()</code> method.</li>
<li>Changed <code>Configuration</code>/<code>IReaderConfiguration</code>/<code>IWriterConfiguration</code> <code>ClassMap AutoMap&lt;T&gt;()</code> to <code>ClassMap&lt;T&gt; AutoMap&lt;T&gt;()</code></li>
<li>Changed <code>TypeConverterException</code> constructors parameter from <code>ReadingContext</code> to <code>IReadingContext</code>.</li>
</ul>
<h3 id="section-116">3.4.0</h3>
<h4 id="bug-fixes-76">Bug Fixes</h4>
<ul>
<li>Fixed issue when a map was created through auto mapping, you couldn't use sub property mapping to update a member.</li>
</ul>
<h3 id="section-117">3.3.0</h3>
<h4 id="features-48">Features</h4>
<ul>
<li>Added more information to the <code>DefaultTypeConverter.ConvertFromString</code> not convertible exception.</li>
<li>Reduced the number of <code>PrepareHeaderForMatch</code> calls.</li>
</ul>
<h3 id="section-118">3.2.0</h3>
<h4 id="features-49">Features</h4>
<ul>
<li>Attribute mapping. It's back...</li>
</ul>
<h3 id="section-119">3.1.1</h3>
<h4 id="bug-fixes-77">Bug Fixes</h4>
<ul>
<li>Fixed issue where you weren't able to write <code>IEnumerable</code>.</li>
</ul>
<h3 id="section-120">3.1.0</h3>
<h4 id="features-50">Features</h4>
<ul>
<li>Allow multiple headers to be written.</li>
</ul>
<h4 id="bug-fixes-78">Bug Fixes</h4>
<ul>
<li>Flush <code>CsvWriter</code> on <code>Dispose</code>.</li>
<li>Made <code>ShouldSkipRecord</code> not called if the parser returns <code>null</code> for an end of stream.</li>
<li><code>ShouldUseConstructorParameters</code> returns <code>false</code> if there are no constructors.</li>
<li>Header validation doesn't validate members where <code>ConvertUsing</code> or <code>Constant</code> are used.</li>
</ul>
<h3 id="section-121">3.0.0</h3>
<h4 id="features-51">Features</h4>
<ul>
<li>netstandard2.0</li>
<li>Massive speed improvements to the <code>CsvParser</code>.</li>
<li>Speed improvements to <code>CsvSerializer</code>.</li>
<li>Map child properties so multiple mapping classes aren't needed.</li>
<li><code>ConvertUsing</code> implementation for writing.</li>
<li>Read/write <code>IEnumerable</code> properties.</li>
<li>Field mapping.</li>
<li>Async reading/writing.</li>
<li>Added <code>ClassMapBuilder</code> to build maps on the fly without a mapping class.</li>
<li>Write <code>IDynamicMetaObjectProvider</code> objects. <code>DynamicObject</code> and <code>ExpandoObject</code> are the 2 most common.</li>
<li>Allow <code>null</code> fields to be written.</li>
<li><code>IDictionary</code> type converters.</li>
<li>Added trim options to trim in parser and removed trim from reader.</li>
<li>Header validation.</li>
<li>Field validation.</li>
<li>Added <code>leaveOpen</code> flag to constructors to not dispose of underlying <code>TextReader</code> and <code>TextWriter</code>.</li>
<li>Added properties to <code>CsvHelperException</code> and removed the string data.</li>
<li>Speed up mappings that use <code>ConvertUsing</code> by caching the named indexes.</li>
<li>Write comments.</li>
<li>Map constants.</li>
<li>Write fields that aren't mapped.</li>
<li>Specify values that resolve to <code>null</code> when reading.</li>
<li>Added CsvProperMap<T> to allow for compile time type checking on mappings.</li>
<li>Read more than 1 header row.</li>
<li>Changed reading exception callback to send a CsvHelperException.</li>
<li>Map the same property more than once.</li>
<li>Exposed the underlying TextReader as a property.</li>
<li>Removed header matching manipulation configuration <code>IsHeaderCaseSensitive</code>, <code>IgnoreHeaderWhiteSpace</code>, and <code>TrimHeaders</code> and added a config for <code>PrepareHeaderForMatch</code> that is a function. Both the header field name and the property name are ran through this method before matching against each other.</li>
<li>Added interfaces for configuration so you can tell what options are available in your current context.</li>
<li>Moved detection of column count changes into the reader. The parser shouldn't care and should just return whatever data it finds.</li>
<li><code>ConstructUsing</code> works with reference maps.</li>
<li><code>ConstructUsing</code> can use initializers.</li>
<li>Allow resuming reading of more data is written to the stream.</li>
<li>Auto mapping with user defined <code>struct</code>.</li>
<li>Ability to change required quote characters.</li>
<li>Speed improvements when using <code>GetField</code>.</li>
<li>Speed improvements when using <code>WriteField</code>.</li>
<li>Allow mapping default value to be a string that is converted.</li>
<li>Moved reading/writing state data into a common context object that is shared.</li>
<li>Multiple <code>string</code> formats for <code>TypeConverterOptions</code>.</li>
<li>Created object resolver so interfaces can be mapped to and IoC containers can be plugged in.</li>
<li>Made methods <code>ReIndex</code> and <code>GetMaxIndex</code> on <code>CsvClassMap</code> <code>public</code>.</li>
<li>Added a <code>Flush</code> method to the writer so <code>NextRecord</code> just writes a line ending. This will allow users to not write a line ending if they want.</li>
<li>Removed statics to eliminate possible threading issues.</li>
<li>Added <code>SerializableAttribute</code> to exception classes. It was removed previously because of netstandard1.x not having it available.</li>
<li>Added <code>ByteArrayConverter</code>.</li>
<li>Reading anonymous types.</li>
<li>Auto mapping with any constructor.</li>
<li>Changed <code>Property</code> naming to <code>Member</code> since both properties and fields are used.</li>
<li><code>TypeConverterFactory</code> is now instance of <code>Configuration</code> instead of a static.</li>
<li>Changed <code>Configuration</code> flags to callbacks with default functionality to let the user change the functionality if they want.</li>
</ul>
<h4 id="bug-fixes-79">Bug Fixes</h4>
<ul>
<li>Fixed issue with <code>CsvClassMapCollection[type]</code> choosing the wrong type when multiple types on the inheritance tree are mapped.</li>
<li>Fixed issue where setting <code>Configuration.ShouldSkipRecord</code> method always overrides the <code>Configuration.SkipEmptyRecords</code> setting.</li>
<li>Fixed issue where ignoring header whitespace wouldn't work if a named property had the same whitespace in it.</li>
<li>When comments are on and a field is being written that is the first field in the record and the first char is a comment char, quote the field because it's not a comment.</li>
<li>Fixed issue with type converter options set in factory not working with auto mapping or explicit map.</li>
<li>Fixed line ending spanning buffer issue.</li>
<li>Fixed issue of skipping a character if a line ending was within a quoted field.</li>
<li>Added locking to factory to make it thread safe.</li>
<li>Fixed bug when mapping a constant then mapping another property after will throw an exception.</li>
<li>Changed reflection calls to <code>ConvertToString</code> to get the method for <code>ITypeConverter</code> instead of the actual converter. This is so the overridden implementation will be used instead of a random method with the same name.</li>
<li>Adding locking in <code>ReflectionHelper.CreateInstance</code> for the static delegate cache.</li>
<li>Fixed quote handling issue of <code>IsFieldBad</code> by marking unquoted fields with quote chars as bad only when <code>Configuration.IgnoreQuotes</code> is <code>false</code>.</li>
<li>Fixed issue with automapping not mapping references correctly in some nested situations because it thought it was a circular dependency when it wasn't.</li>
<li>Fixed issue with private properties not being able to be set.</li>
<li>Fixed issue with getting the class map from the collection. It was only getting the current and not looking up the tree.</li>
<li>Fixed issue with <code>Constant</code> not working with <code>null</code>.</li>
</ul>
<h4 id="breaking-changes-30">Breaking Changes</h4>
<ul>
<li>Removed all .NET builds except for net45 and netstandard2.0.</li>
<li>Removed obsolete code.</li>
<li><code>object ICsvReader.GetField( int index, ITypeConverter converter )</code></li>
<li><code>object ICsvReader.GetField( string name, ITypeConverter converter )</code></li>
<li><code>object ICsvReader.GetField( string name, int index, ITypeConverter converter )</code></li>
<li><code>void ICsvWriter.WriteField( Type type, object field )</code></li>
<li><code>void ICsvWriter.WriteField( Type type, object field, ITypeConverter converter )</code></li>
<li><code>void ICsvWriter.WriteRecord( Type type, object record )</code></li>
<li>Moved methods that aren't row level out of <code>ICsvReaderRow</code> and into <code>ICsvReader</code>.</li>
<li><code>IEnumerable&lt;T&gt; GetRecords&lt;T&gt;()</code></li>
<li><code>IEnumerable&lt;object&gt; GetRecords( Type type )</code></li>
<li><code>void ClearRecordCache&lt;T&gt;()</code></li>
<li><code>void ClearRecordCache( Type type )</code></li>
<li><code>void ClearRecordCache()</code></li>
<li>Removed <code>CanConvertTo</code> and <code>CanConvertFrom</code> from the type converters because there is no need for them.</li>
<li>Added properties to <code>CsvHelperException</code> and removed the string data.</li>
<li>Changed <code>WriteRecord</code> to not call <code>NextRecord</code>.</li>
<li>Changed config setting name from <code>IgnorePrivateAccessor</code> to <code>IncludePrivateProperties</code> to be more clear on intention.</li>
<li>Changed reading exception callback to send a <code>CsvHelperException</code>.</li>
<li>Removed configuration <code>IsHeaderCaseSensitive</code>, <code>IgnoreHeaderWhiteSpace</code>, and <code>TrimHeaders</code> and added <code>PrepareHeaderForMatch</code>.</li>
<li>Changed <code>DateTime</code> and <code>DateTimeOffset</code> converters to not work when the <code>string</code> is spaces to match what all the other converters do. The .NET Framework <code>DateTime</code> and <code>DateTimeOffset</code> converters will convert a <code>string</code> of all spaces into <code>MinValue</code>, so we are diverging from that a little.</li>
<li>Changed <code>ReadHeader</code> to not set <code>CurrentRecord</code> to <code>null</code>.</li>
<li>Removed Excel specific code. This will go into a separate library. The malformed fallback behavior that mimics Excel still exists.</li>
<li>Moved reading/writing state data into a common context object that is shared.</li>
<li>Changed <code>BadDataCallback</code> to take in a <code>ReadingContext</code> instead of a <code>string</code>.</li>
<li>Removed <code>Csv</code> prefix from all classes except <code>CsvReader</code>, <code>CsvParser</code>, <code>CsvWriter</code>, and <code>CsvSerializer</code>.</li>
<li>Removed default <code>null</code> values since there is no common standard that could be found.</li>
<li>Removed default <code>boolean</code> values of <code>yes</code>, <code>y</code>, <code>no</code>, <code>n</code> since it's not a standard boolean. <code>true</code>, <code>false</code>, <code>1</code>, <code>0</code> still work.</li>
<li>Changed default delimiter to <code>,</code> instead of ListSeparator.</li>
<li>Added a <code>Flush</code> method to the writer.</li>
<li>Changed <code>Property</code> naming to <code>Member</code>.</li>
<li>Removed <code>Configuration</code>s <code>ThrowOnBadData</code>, <code>IgnoreReadingExceptions</code>, <code>SkipEmptyRecords</code>, and <code>WillThrowOnMissingField</code> in favor of function callbacks.</li>
<li>Renamed
<ul>
<li><code>TypeConverterFactory</code> to <code>TypeConverterCache</code></li>
<li><code>TypeConverterOptionsFactory</code> to <code>TypeConverterOptionsCache</code></li>
<li><code>Configuration.HeaderValidatedCallback</code> to <code>Configuration.HeaderValidated</code></li>
<li><code>Configuration.MissingFieldFoundCallback</code> to <code>Configuration.MissingFieldFound</code></li>
<li><code>Configuration.ReadingExceptionCallback</code> to <code>Configuration.ReadingExceptionOccurred</code></li>
<li><code>Configuration.BadDataFoundCallback</code> to <code>Configuration.BadDataFound</code></li>
<li><code>ICsvParser</code> to <code>IParser</code></li>
<li><code>FieldReader</code> to <code>CsvFieldReader</code></li>
<li><code>ICsvReader</code> to <code>IReader</code></li>
<li><code>ICsvReaderRow</code> to <code>IReaderRow</code></li>
<li><code>ICsvSerializer</code> to <code>ISerializer</code></li>
<li><code>ICsvWriter</code> to <code>IWriter</code></li>
<li><code>ICsvWriterRow</code> to <code>IWriterRow</code></li>
</ul>
</li>
</ul>
<h3 id="section-122">2.16.3</h3>
<h4 id="bug-fixes-80">Bug Fixes</h4>
<ul>
<li>Fixed issue with <code>CsvClassMapCollection[type]</code> choosing the wrong type when multiple types on the inheritance tree are mapped.</li>
</ul>
<h3 id="section-123">2.16.2</h3>
<h4 id="bug-fixes-81">Bug Fixes</h4>
<ul>
<li>Made <code>TypeInfo</code> compatibility stuff internal to not cause conflicts.</li>
</ul>
<h3 id="section-124">2.16.1</h3>
<h4 id="bug-fixes-82">Bug Fixes</h4>
<ul>
<li>Fix for UWP release not working.</li>
</ul>
<h3 id="section-125">2.16</h3>
<h4 id="features-52">Features</h4>
<ul>
<li>Added <code>CsvReader.ReadHeader</code> so headers can be read without reading the first row.</li>
</ul>
<h3 id="section-126">2.15.0.2</h3>
<h4 id="features-53">Features</h4>
<ul>
<li>Update to .NET Core 1.0 release.</li>
</ul>
<h3 id="section-127">2.15</h3>
<h4 id="features-54">Features</h4>
<ul>
<li>Added <code>SerializableAttribute</code> to all exceptions.</li>
</ul>
<h3 id="section-128">2.14.3</h3>
<h4 id="features-55">Features</h4>
<ul>
<li>Updated project to .NET Core RC2.</li>
</ul>
<h4 id="bug-fixes-83">Bug Fixes</h4>
<ul>
<li>Fixed issue with assembly not being a release build.</li>
</ul>
<h3 id="section-129">2.14.2</h3>
<h4 id="bug-fixes-84">Bug Fixes</h4>
<ul>
<li>Added net45 build and excluded it from CoreFX compatibility.</li>
</ul>
<h3 id="section-130">2.14.1</h3>
<h4 id="bug-fixes-85">Bug Fixes</h4>
<ul>
<li>Fixed issue with .NET 2.0 classes being included that shouldn't have been in .NET 4.0.</li>
</ul>
<h3 id="section-131">2.14</h3>
<h4 id="features-56">Features</h4>
<ul>
<li>Added CoreCLR support.</li>
</ul>
<h3 id="section-132">2.13.5</h3>
<h4 id="bug-fixes-86">Bug Fixes</h4>
<ul>
<li>Fixed <code>ShouldSkipRecord</code> not working on rows before header.</li>
</ul>
<h3 id="section-133">2.13.3</h3>
<h4 id="bug-fixes-87">Bug Fixes</h4>
<ul>
<li>Fixed issue where the number of delimiter characters was read when a multiple character delimiter is hit. This was causing non-delimiters to be read when just the first character of the delimiter was found.</li>
</ul>
<h3 id="section-134">2.13.2</h3>
<h4 id="bug-fixes-88">Bug Fixes</h4>
<ul>
<li>Fixed issue with <code>TryGetField</code> with named index returning wrong value.</li>
</ul>
<h3 id="section-135">2.13.1</h3>
<h4 id="bug-fixes-89">Bug Fixes</h4>
<ul>
<li>Added missing <code>DateTimeConverter</code> to the list of default converters.</li>
</ul>
<h3 id="section-136">2.13</h3>
<h4 id="features-57">Features</h4>
<ul>
<li>When writing, use empty values for properties on reference properties when flag <code>UseNewObjectForNullReferenceProperties</code> is off.</li>
</ul>
<h4 id="bug-fixes-90">Bug Fixes</h4>
<ul>
<li>Fixed portable target for Windows Phone 8.1.</li>
</ul>
<h3 id="section-137">2.12</h3>
<h4 id="features-58">Features</h4>
<ul>
<li>Added Windows Phone 8.1 support to the PCL assembly.</li>
<li>Added ability to set a prefix for reference maps. i.e. <code>Prefix( string prefix = null)</code></li>
<li>Added callback to use to determine if a record should be skipped when reading.</li>
<li>Excel leading zeros number formatting. This allows you to read and write numbers that will preserve the zeros on the front. i.e. <code>=&quot;0001&quot;</code></li>
<li>Use default value when a field is null because of a missing field in the row.</li>
<li>Added <code>TrimFields</code> to CsvWriter.</li>
<li>ability to specify constructor arguments when referencing another map within a mapping.</li>
<li>Added <code>Names</code> property on <code>CsvPropertyNameCollection</code> to get raw list of property names.</li>
<li>Added raw file line number to parser.</li>
<li>Mapping methods on <code>CsvClassMap&lt;T&gt;</code> are now public to more easily allow mapping during runtime.</li>
<li>Added <code>DateTimeOffset</code> converter.</li>
</ul>
<h4 id="bug-fixes-91">Bug Fixes</h4>
<ul>
<li>Fixed exception that was occurring when fields were empty and <code>UseExcelLeadingZerosFormatForNumerics = true</code>.</li>
<li>Excel compatibility fix. If a field starts with a quote but never ends and the end of the file is reached, the field would be null. The field will now contain everything.</li>
<li>Don't get static properties when automapping.</li>
<li>Made all exceptions thrown contain Exception.Data[&quot;CsvHelper&quot;].</li>
<li>Fixed missing support writing the double quotes for inner quotes on a quoted field. This used to be there and was removed at some point. A unit test is now in place so this doesn't happen again.</li>
</ul>
<h3 id="section-138">2.11.1.1</h3>
<h4 id="bug-fixes-92">Bug Fixes</h4>
<ul>
<li>Fixed issue with writing an array of records.</li>
</ul>
<h3 id="section-139">2.11</h3>
<h4 id="features-59">Features</h4>
<ul>
<li>Allow preservation of numeric strings for Excel.</li>
</ul>
<h4 id="bug-fixes-93">Bug Fixes</h4>
<ul>
<li>Fixed writing issue with anonymous objects outputting wrong headers.</li>
</ul>
<h3 id="section-140">2.10</h3>
<h4 id="features-60">Features</h4>
<ul>
<li>Updated writer methods to match reader methods.</li>
</ul>
<h3 id="section-141">2.9.1</h3>
<h4 id="bug-fixes-94">Bug Fixes</h4>
<ul>
<li>Fixed issue where char converter would trim a single space string.</li>
</ul>
<h3 id="section-142">2.9</h3>
<h4 id="features-61">Features</h4>
<ul>
<li>Added support to ignore whitespace when determining a record is empty.</li>
</ul>
<h3 id="section-143">2.8.4</h3>
<h4 id="bug-fixes-95">Bug Fixes</h4>
<ul>
<li>Fixed breaking change to not break.</li>
</ul>
<h3 id="section-144">2.8.3</h3>
<h4 id="bug-fixes-96">Bug Fixes</h4>
<ul>
<li>Fixed issue where header wasn't written when there were no records in the IEnumerable on WriteRecords( IEnumerable ).</li>
</ul>
<h3 id="section-145">2.8.2</h3>
<h4 id="bug-fixes-97">Bug Fixes</h4>
<ul>
<li>Fixed issue where an exception was always thrown if Configuration.ThrowOnBadData is on.</li>
</ul>
<h3 id="section-146">2.8</h3>
<h4 id="features-62">Features</h4>
<ul>
<li>Added configurations for a callback when a bad field is detected. Added configuration to throw an exception when a bad field is detected.</li>
<li>Made mapping with interfaces not duplicate property maps.</li>
</ul>
<h3 id="section-147">2.7.1</h3>
<h4 id="bug-fixes-98">Bug Fixes</h4>
<ul>
<li>Fixed issue with mappings overwriting an explicitly set index when re-indexing.</li>
<li>Auto mapping will ignore Enumerable properties instead of throwing an exception. Exceptions will still be thrown if an Enumerable is used outside of auto mapping.</li>
</ul>
<h3 id="section-148">2.7</h3>
<h4 id="bug-fixes-99">Bug Fixes</h4>
<ul>
<li>Fixed issue where using dynamic proxy objects would always automap instead of using a registered class map.</li>
<li>Fixed issue when trimming fields and the field is null.</li>
<li>Fixed issue when writing a field and the value is null.</li>
<li>Removed deprecated writer methods.</li>
</ul>
<h3 id="section-149">2.6.1</h3>
<h4 id="features-63">Features</h4>
<ul>
<li>PCL implementation. .NET 4.0+, Silveright 4.0+, WP7 7.5+, Windows 8</li>
<li>Excel separator record reading and writing.</li>
<li>Writer speed enhancements. Thanks to thecontrarycat.</li>
</ul>
<h4 id="bug-fixes-100">Bug Fixes</h4>
<ul>
<li>Fixed issue with mapping order when no index is specified.</li>
</ul>
<h3 id="section-150">2.6</h3>
<h4 id="features-64">Features</h4>
<ul>
<li>Added config to prefix headers of reference properties with the parent property name when automapping.</li>
<li>Ability to ignore blank lines. When this config option is set to false, the parser will return and array of nulls. You can differentiate between a row with commas this way. The reader will behave the same way as a blank record.</li>
</ul>
<h4 id="bug-fixes-101">Bug Fixes</h4>
<ul>
<li>Fixed issue when writing and a reference map type is a struct.</li>
</ul>
<h3 id="section-151">2.5</h3>
<h4 id="features-65">Features</h4>
<ul>
<li>Global type converter options.</li>
<li>Easier access to property maps to allow for changing maps on the fly.</li>
<li>Option to ignore references when auto mapping.</li>
<li>AutoMap functionality is available in class maps.</li>
<li>Mappings can be specified in the constructor of the mapping class. Overriding CreateMap is now deprecated.</li>
</ul>
<h4 id="bug-fixes-102">Bug Fixes</h4>
<ul>
<li>Updated ConvertUsing to not cause the exception &quot;Operation Could Destabilize the Runtime&quot; when property is a nullable type and a non-nullable type is returned.</li>
</ul>
<h3 id="section-152">2.4.1</h3>
<h4 id="bug-fixes-103">Bug Fixes</h4>
<ul>
<li>Fixed issue where parsing would add delimiter chars to the field when the buffer ran out in the middle of the delimiter.</li>
</ul>
<h3 id="section-153">2.4</h3>
<h4 id="features-66">Features</h4>
<ul>
<li>Split writing up into a writer and serializer so the writer can write other things besides CSV files.</li>
</ul>
<h4 id="bug-fixes-104">Bug Fixes</h4>
<ul>
<li>Fixed issue where a NullReferenceException was thrown when using reference maps and a reference was null.</li>
<li>Fixed issue where TryGetField was throwing MissingFieldException.</li>
<li>Fixed issue where a commented row on the last line that doesn't have a newline will return the commented row.</li>
<li>Fixed NuGet package for WP8.</li>
<li>Added missing WriteHeader methods to ICsvWriter that were a part of CsvWriter.</li>
</ul>
<h3 id="section-154">2.3</h3>
<h4 id="features-67">Features</h4>
<ul>
<li>Support for TimeSpan.</li>
<li>Support for writing records of type dynamic. The dynamic objects do not work with collections, which means ExpandoObject doesn't currently work.</li>
</ul>
<h4 id="bug-fixes-105">Bug Fixes</h4>
<ul>
<li>Fixed issue with extra exception info not being added when the reading exception callback is used.</li>
<li>Fixed issue where having only reference maps throws exception.</li>
</ul>
<h3 id="section-155">2.2.2</h3>
<h4 id="bug-fixes-106">Bug Fixes</h4>
<ul>
<li>Fixed issue with parser where a line wouldn't end if the previous char was a \0.</li>
</ul>
<h3 id="section-156">2.2.1</h3>
<h4 id="bug-fixes-107">Bug Fixes</h4>
<ul>
<li>Fixed issue with trimming fields not working under one path.
2.2.0</li>
</ul>
<h4 id="features-68">Features</h4>
<ul>
<li>Added Row property to ICsvReader.</li>
<li>Config option to trim headers and values when reading.</li>
</ul>
<h3 id="section-157">2.1.1</h3>
<h4 id="bug-fixes-108">Bug Fixes</h4>
<ul>
<li>Fixed issue when WillThrowOnMissingField is off and exception was still being thrown.</li>
</ul>
<h3 id="section-158">2.1.0</h3>
<h4 id="features-69">Features</h4>
<ul>
<li>Made RegisterClassMap overload with CsvClassMap instance public.</li>
</ul>
<h3 id="section-159">2.0.1</h3>
<h4 id="bug-fixes-109">Bug Fixes</h4>
<ul>
<li>Made a WinRT Any CPU build and removed the arch specific WinRT builds.</li>
</ul>
<h3 id="section-160">2.0.0</h3>
<h4 id="features-70">Features</h4>
<ul>
<li>Added parser configuration to ignoring quotes and treating them like any other character.</li>
<li>Added CsvFactory to create ICsvParser, ICsvReader, and ICsvWriter classes. This is useful when you need to unit test code that uses CsvHelper since these 3 classes require a TextReader or TextWriter to work.</li>
<li>All assembly versions are strong named but will use a single version of 2.0.0.0. The file version and NuGet versions will change with every release.</li>
<li>Removed class type constraint from reading and writing.</li>
<li>Added non-generic class mapping overload.</li>
<li>WriteRecords param changed from IEnumerable<object> to non-generic IEnumerable.</li>
<li>Value types can be read and written instead of just custom classes.</li>
<li>Indexes are automatically set and incremented when mapping in order of the Map and Reference calls.</li>
<li>Auto mapping with circular reference detection.</li>
<li>Config option to ignore spaces in header names.</li>
<li>Fixed exception handling. Exception are no longer wrapped. Exception.Data[&quot;CsvHelper&quot;] contains CsvHelper specific exception info.</li>
<li>Row exception can be skipped during GetRecords.</li>
<li>Renamed IsStrictMode to WillThrowOnMissingField.</li>
<li>Window Phone 7 &amp; 8 builds.</li>
<li>Auto mapping will use defined maps if available.</li>
<li>Type converter options.</li>
<li>Added IEnumerable converter that throws an exception so people will know that converting to/from and enumerable is not supported instead of getting a cryptic error message.</li>
<li>Dynamic support for reading and writing.</li>
<li>Multiple maps can be supplied.</li>
<li>Renamed InvalidateRecordCache to ClearRecordCache.</li>
<li>Recursive reference mapping down the whole mapping tree.</li>
<li>Configuration.CultureInfo was added in place of Configuration.UseInvariantCulture.</li>
</ul>
<h4 id="bug-fixes-110">Bug Fixes</h4>
<ul>
<li>Getting the exception helper message failed when writing because no parser is available.</li>
<li>WriteRecords Dynamic invoke had wrong parameter count.</li>
<li>GetField( string ) was not returning null if the header is not found.</li>
<li>CsvBadDataException when there were extra columns in the row.</li>
<li>Raw record corruption.</li>
</ul>
<h3 id="section-161">1.17.0</h3>
<h4 id="features-71">Features</h4>
<ul>
<li>Ignore properties that can't be set in attribute mapping.</li>
<li>Made TypeConverterFactory thread safe.</li>
<li>Added remove converter method.</li>
</ul>
<h4 id="bug-fixes-111">Bug Fixes</h4>
<ul>
<li>Issue with writer exception in WinRT.</li>
</ul>
<h3 id="section-162">1.16.0</h3>
<h4 id="features-72">Features</h4>
<ul>
<li>Change TypeConverterFactory to use a set of cache type converters so global type converters can be used.</li>
<li>Added GetField&lt;T, TConverter&gt; overloads.</li>
<li>Changed all Activator.CreateInstance calls to use compiled expression trees to create them instead.</li>
<li>Changed mapping for ConvertUsing to accept a Func so a block expression can be used.</li>
</ul>
<h3 id="section-163">1.15.0</h3>
<h4 id="features-73">Features</h4>
<ul>
<li>Support for Silverlight 4 &amp; 5.</li>
</ul>
<h4 id="bug-fixes-112">Bug Fixes</h4>
<ul>
<li>Issue where writing with Configuration.QuoteAllFields enabled will not quote the quotes inside the field.</li>
<li>Issue with WinRT not building after pull request merge.</li>
</ul>
<h3 id="section-164">1.14.0</h3>
<h4 id="features-74">Features</h4>
<ul>
<li>Parse full line on read. This allows for the parser to retain the whole unchanged raw CSV lin on a read.</li>
<li>Changed delimiter config from a char to a string.</li>
<li>Iterating records multiple times will throw a CsvReaderException. This is to help stop confusion when 0 results are returned the second iteration.</li>
</ul>
<h4 id="bug-fixes-113">Bug Fixes</h4>
<ul>
<li>Issue where EnumConverter isn't created correctly from the TypeConverterFactory.</li>
<li>Issue with updating count for all closing quotes.</li>
</ul>
<h3 id="section-165">1.13.0</h3>
<h4 id="features-75">Features</h4>
<ul>
<li>Configuration to always not quote all fields.</li>
<li>WriteHeader method is public.</li>
<li>Added enum converter.</li>
</ul>
<h4 id="bug-fixes-114">Bug Fixes</h4>
<ul>
<li>Issue with boolean converter returning true for &quot;no&quot; value.</li>
<li>Issue with GetMethod in WinRT.</li>
</ul>
<h3 id="section-166">1.12.1</h3>
<h4 id="bug-fixes-115">Bug Fixes</h4>
<ul>
<li>Issue where an exception was being thrown when reading all records multiple times.</li>
</ul>
<h3 id="section-167">1.12.0</h3>
<h4 id="features-76">Features</h4>
<ul>
<li>WinRT support.</li>
</ul>
<h3 id="section-168">1.11.0</h3>
<h4 id="features-77">Features</h4>
<ul>
<li>Better exception information added to CsvBadDataException.</li>
</ul>
<h3 id="section-169">1.10.0</h3>
<h4 id="features-78">Features</h4>
<ul>
<li>Mapping property for CreateUsing which allows user to specify how the property gets created.</li>
</ul>
<h3 id="section-170">1.9.2</h3>
<h4 id="bug-fixes-116">Bug Fixes</h4>
<ul>
<li>Issue with skipping empty records.</li>
</ul>
<h3 id="section-171">1.9.1</h3>
<h4 id="bug-fixes-117">Bug Fixes</h4>
<ul>
<li>Issue with detecting column count changes.</li>
</ul>
<h3 id="section-172">1.9.0</h3>
<h4 id="features-79">Features</h4>
<ul>
<li>Added properties to CsvReaderException to give more information about the error.</li>
<li>Ability to skip empty records based on config settings.</li>
<li>Getting by index that doesn't exist will give a default or CsvMissingFieldException.</li>
<li>Made column count detection a config setting.</li>
<li>Map option for constructing the row object.</li>
<li>Throw exception when inconsistent column lengths are detected.</li>
<li>String.Format support in CsvWriter.</li>
<li>Excel compatible parsing.</li>
<li>Parser can keep track of the byte position using an encoding so a user can seek to a stream and start reading from there.</li>
</ul>
<h4 id="bug-fixes-118">Bug Fixes</h4>
<ul>
<li>Fixed bug with column count detection.</li>
<li>Issue with double counting the closing quote.</li>
<li>Issue where parsing was incorrect when the last row didn't have a CRLF at the end.</li>
<li>Issue with error messages.</li>
</ul>
<h3 id="section-173">1.8.0</h3>
<h4 id="features-80">Features</h4>
<ul>
<li>Writer overload for shouldQuote when writing a field.</li>
<li>Ability for using alternative names for headers in the configuration.</li>
<li>Better error messages.</li>
</ul>
<h3 id="section-174">1.7.0</h3>
<h4 id="features-81">Features</h4>
<ul>
<li>Configuration to quote all fields when writing.</li>
<li>Parser keeps a char count of where it's at.</li>
</ul>
<h4 id="bug-fixes-119">Bug Fixes</h4>
<ul>
<li>Fixed subclass issue by having the reader and writer use interfaces instead of concrete classes.</li>
</ul>
<h3 id="section-175">1.6.0</h3>
<h4 id="features-82">Features</h4>
<ul>
<li>Custom boolean type converter that can convert from 1 and 0 besides the normal conversion.</li>
<li>Property map configuration to set a default value.</li>
<li>CsvWriter no longer flushes to the output stream after every record.</li>
<li>Non-generic overloads for reading, writing, and attribute mapping.</li>
<li>Invalidate record cache will clear the properties list.</li>
</ul>
<h3 id="section-176">1.5.0</h3>
<h4 id="features-83">Features</h4>
<ul>
<li>Support .NET 2.0 and 3.5 builds.</li>
</ul>
<h3 id="section-177">1.4.0</h3>
<h4 id="features-84">Features</h4>
<ul>
<li>Case insensitive header matching.</li>
</ul>
<h3 id="section-178">1.3.0</h3>
<h4 id="features-85">Features</h4>
<ul>
<li>Removed CsvHelper class.</li>
<li>Property reference mapping. One level deep.</li>
</ul>
<h3 id="section-179">1.2.0</h3>
<h4 id="features-86">Features</h4>
<ul>
<li>Support for multiple duplicate header names.</li>
</ul>
<h3 id="section-180">1.1.2</h3>
<h4 id="bug-fixes-120">Bug Fixes</h4>
<ul>
<li>Issue when using a readonly or writeonly stream and disposing causes an exception.</li>
</ul>
<h3 id="section-181">1.1.1</h3>
<h4 id="features-87">Features</h4>
<ul>
<li>Updated CsvHelper.cs to allow for readonly and writeonly stream.</li>
</ul>
<h4 id="bug-fixes-121">Bug Fixes</h4>
<ul>
<li>Fixed DateTimeConverter issue where a white space string would return a - DateTime.MinValue instead of null.</li>
</ul>
<h3 id="section-182">1.1.0</h3>
<h4 id="features-88">Features</h4>
<ul>
<li>Changed .NET 3.5 project to client profile.</li>
<li>Added getter for the current record in the header.</li>
</ul>
<h3 id="section-183">1.0.0</h3>
<h4 id="features-89">Features</h4>
<ul>
<li>Changed strict mode to default to true.</li>
<li>Renamed strict mode configuration property.</li>
<li>Changed reader to not throw an exception when there are duplicate header records unless in strict mode.</li>
</ul>
<h4 id="bug-fixes-122">Bug Fixes</h4>
<ul>
<li>Fixed bug where if there is no line ending at the end of the file, the last field would be null instead of an empty string.</li>
<li>Fixed configuration references and constructor signatures.</li>
</ul>
<h3 id="section-184">0.16.0</h3>
<h4 id="features-90">Features</h4>
<ul>
<li>Added configuration option for using CultureInvariant to read/write.</li>
<li>Updated the reader/writer to use the config option.</li>
<li>Both CsvReader and CsvWriter are using Local culture when converting from/to strings.</li>
<li>CsvClassMap without generic argument.</li>
</ul>
<h3 id="section-185">0.15.0</h3>
<h4 id="features-91">Features</h4>
<ul>
<li>Changed TryGetField<T> to do a low level check instead of jsut wrapping in try/catch blocks.</li>
<li>Removed non generic TryGetField methods.</li>
<li>Formatting changes.</li>
<li>Changed CsvParser to use the Configuration.Comment char instead of #.</li>
</ul>
<h4 id="bug-fixes-123">Bug Fixes</h4>
<ul>
<li>Fixed indentation error caused by new constructor in CsvPropertyMap.</li>
</ul>
<h3 id="section-186">0.14.0</h3>
<h4 id="features-92">Features</h4>
<ul>
<li>Changed GetRecords<T> to return IEnumerable<T>.</li>
<li>Added convenience constructor to CsvPropertyMap.</li>
<li>Major configuration overhaul.</li>
<li>Changed end of file check to be more low level.</li>
<li>Final record is returned if there is a trailing delimiter.</li>
<li>Added an exception re-throw to parsing that tells the line and character number.</li>
<li>Added ability to change what the quote char is.</li>
<li>Added CSV specific exceptions.</li>
</ul>
<h4 id="bug-fixes-124">Bug Fixes</h4>
<ul>
<li>Fix for issue when CsvHelper uses CurrentCulture instead of InvariantCulture.</li>
</ul>
<h3 id="section-187">0.13.0</h3>
<h4 id="features-93">Features</h4>
<ul>
<li>Changed StreamReader to TextReader to be more generic.</li>
</ul>
<h3 id="section-188">0.12.0</h3>
<h4 id="features-94">Features</h4>
<ul>
<li>Added option to have a commented out line using '#' as the first character of the line.</li>
</ul>
<h4 id="bug-fixes-125">Bug Fixes</h4>
<ul>
<li>Fixed issue with spaces in non-quoted field.</li>
</ul>

					</div>
				</div>
		</div>
	</main>

	<br /><br />

	<footer id="footer" class="footer">
	<div class="has-text-centered">&copy; 2009-2024 Josh Close</div>
</footer>



	<script>
		hljs.configure({
			tabReplace: "    "
		});
		hljs.initHighlightingOnLoad();
	</script>
	<script src="/CsvHelper/scripts/header.js"></script>
	<script src="/CsvHelper/scripts/sidebar.js"></script>
	
</body>
</html>
